[英]Is there a standard function that computes `f x (g x)`?
我在Hoogle上找不到任何東西,但有一個標准函數或運算符,其簽名如下:
func :: (a -> b -> c) -> (a -> b) -> a -> c
即給出兩個函數f
和g
以及一個元素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)
...這與您的簽名模數字母重命名相同。
這是因為函數類型(->)
具有Functor
, Applicative
和Monad
實例,它們被慣用地稱為“reader”。 這些實例為所有參數設置了一個額外的參數,這正是你的函數所做的。
f <*> g
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
是的,這是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減少( r
是x
):
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.