簡體   English   中英

是否有一個計算`fx(gx)`的標准函數?

[英]Is there a standard function that computes `f x (g x)`?

我在Hoogle上找不到任何東西,但有一個標准函數或運算符,其簽名如下:

func :: (a -> b -> c) -> (a -> b) -> a -> c

即給出兩個函數fg以及一個元素x作為參數,它計算fx (gx)

您正在尋找的功能是(<*>) 為什么? 嗯, (<*>)有一個更通用的類型:

(<*>) :: Applicative f => f (a -> b) -> f a -> f b

但是考慮到我們可以將f專門化為(->) r ,它有一個Applicative實例:

(<*>) :: (->) r (a -> b) -> (->) r a -> (->) r b

...然后我們可以重新排列類型->是中綴而不是前綴,因為它通常是:

(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)

...這與您的簽名模數字母重命名相同。

這是因為函數類型(->)具有FunctorApplicativeMonad實例,它們被慣用地稱為“reader”。 這些實例為所有參數設置了一個額外的參數,這正是你的函數所做的。

f <*> g ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

請參閱https://wiki.haskell.org/Pointfree

是的,這是ap :: Monad m => m (a -> b) -> ma -> mb的特例

在這里你應該看到monad m(->) r ,所以帶有參數的函數。 現在ap定義為[source]

ap m1 m2 = do
    x1 <- m1
    x2 <- m2
    return (x1 x2)

因此,這是語法糖:

ap m1 m2 = m1 >>= (\x1 -> m2 >>= return . x1)

綁定函數>>=被定義(->) r實例為[source]

instance Monad ((->) r) where
    f >>= k = \ r -> k (f r) r
    return = const

(默認情況下return等於pure ,定義為const )。

這意味着:

ap f g = f >>= (\x1 -> g >>= const . x1)
       = f >>= (\x1 -> (\r -> (const . x1) (g r) r))
       = \x -> (\x1 -> (\r -> (const . x1) (g r) r)) (f x) x

現在我們可以執行beta減少( x1(fx) ):

ap f g = \x -> (\r -> (const . (f x)) (g r) r) x

和另一個beta減少( rx ):

ap f g = \x -> (const . (f x)) (g x) x

我們可以將const\\c _ -> c ,將(.)f . g f . g到`\\ z - > f(gz):

ap f g = \x -> ((\c _ -> c) . (f x)) (g x) x
       = \x -> (\z -> (\c _ -> c) ((f x) z)) (g x) x

現在我們可以再次執行beta減少( z(gx)c((fx) (gx)) ):

ap f g = \x -> ((\c _ -> c) ((f x) (g x))) x
       = \x -> (\_ -> ((f x) (g x))) x

最后我們執行beta減少( _x ):

ap f g = \x -> ((f x) (g x))

我們現在將x移動到函數的頭部:

ap f g x = (f x) (g x)

在Haskell中, fxy(fx) y縮寫,因此這意味着:

ap f g x = (f x) (g x)
         = f x (g x)

這是請求的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM