Tim*_*Tim 0 haskell applicative
声明为
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
适用法律之一是:
x <*> y <*> z = ( pure (.) <*> x <*> y) <*> z
Run Code Online (Sandbox Code Playgroud)
(.)函数之间的组成在哪里 :
(.) :: (b -> c) -> (a -> b) -> (a -> c)
f . g = \x -> f (g x)
Run Code Online (Sandbox Code Playgroud)
在法律的右边,
pure (.)有型f((b -> c) -> (a -> b) -> (a -> c))?x有型f(b->c)?y有型f(a->b)?z有型f(a)?在法律的左侧,
x有型f(a->b->c)?y有型f(a)?z有型f(b)?谢谢。
适用法律在等效单曲面仿函数表示中更容易理解:
class Functor f => Monoidal f where
pureUnit :: f ()
fzip :: f a -> f b -> f (a,b)
--pure x = fmap (const x) pureUnit
--fs<*>xs = fmap (\(f,x)->f x) $ fzip fs xs
--pureUnit = pure ()
--fzip l r = (,) <$> l <*> r
Run Code Online (Sandbox Code Playgroud)
然后,您要询问的法律是这样的:
fzip x (fzip y z) ? fzip (fzip x y) z
Run Code Online (Sandbox Code Playgroud)
凡p ? q我的意思是,当量为元组类型的重新关联,即明确
fzip x (fzip y z) ? fmap (\((a,b),c)->(a,(b,c))) $ fzip (fzip x y) z
Run Code Online (Sandbox Code Playgroud)
因此,这实际上只是一个关联法则。使用infix编写时,甚至更清晰可见(?) = fzip:
x ? (y ? z) ? (x ? y) ? z
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |