cla*_*lay 10 haskell functor applicative
我正在读"了解你一本哈斯克尔"一书.我很难理解这个应用程序的编码器代码:
(*) <$> (+3) <*> (*2) $ 2
Run Code Online (Sandbox Code Playgroud)
这归结为:(3 + 2)*(2*2)= 20
我不遵循如何.我可以将上面的内容扩展为不那么优雅但更明确的新手理解版本:
((fmap (*) (+3)) <*> (*2)) 2
Run Code Online (Sandbox Code Playgroud)
我理解<*>
运营商的基本知识.这很有道理:
class (Functor f) => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
但我不知道命令是如何工作的?有小费吗?
Dav*_*rak 20
处理这类问题的一种方法是使用替代.在这种情况下,使用运算符(<*>)
或函数,获取其实现并将其插入到相关代码中.
如果(*) <$> (+3) <*> (*2) $ 2
您在base中的模块中使用found ((->) a)
实例,则可以通过单击右侧的源链接并搜索"( - >":Applicative
Applicative
instance Applicative ((->) a) where
pure = const
(<*>) f g x = f x (g x)
Run Code Online (Sandbox Code Playgroud)
使用定义(<*>)
我们可以继续替换:
((fmap (*) (+3)) <*> (*2)) 2 == (fmap (*) (+3)) 2 ((*2) 2)
== (fmap (*) (+3)) 2 4
Run Code Online (Sandbox Code Playgroud)
好的,现在我们需要Functor实例((->) a)
.您可以通过进入黑线鳕信息为找到这个Functor
,在这里点击右边的源链接,并搜索"( - >"中找到:
instance Functor ((->) r) where
fmap = (.)
Run Code Online (Sandbox Code Playgroud)
现在继续代替:
(fmap (*) (+3)) 2 4 == ((*) . (+3)) 2 4
== (*) ((+3) 2) 4
== (*) 5 4
== 20
Run Code Online (Sandbox Code Playgroud)
许多人在用象征性思考这些问题时会报告更好的长期成功.而不是通过问题提供2值,而是让焦点反而(*) <$> (+3) <*> (*2)
只在最后应用2.
(*) <$> (+3) <*> (*2)
== ((*) . (+3)) <*> (*2)
== (\x -> ((*) . (+3)) x ((*2) x))
== (\x -> ((*) . (+3)) x (x * 2))
== (\x -> (*) (x + 3) (x * 2))
== (\x -> (x + 3) * (x * 2))
== (\x -> 2 * x * x + 6 * x)
Run Code Online (Sandbox Code Playgroud)
好的,现在插入2 for x
2 * 2 * 2 + 6 * 2
8 + 12
20
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
551 次 |
最近记录: |