给出函数fmap ::(a-> b) - > IO a - > IO b的定义
其效果是通过将函数应用于其结果来转换交互.你应该使用do构造来定义它.
我该如何定义fmap?我不知道吗?
有人可以帮助我吗?
谢谢〜!
它看起来像家庭作业或其他什么,所以我会给你足够的提示,以便你可以自己完成其余的细节.
fmap1 :: (a -> b) -> IO a -> IO b
fmap1 f action =
Run Code Online (Sandbox Code Playgroud)
action是作为IO动作和f是从函数a到b,因此类型a -> b.
如果你熟悉>>=有类型的monadic bind (简化为IOmonad)
(>>=) :: IO a -> (a -> IO b) -> IO b
Run Code Online (Sandbox Code Playgroud)
现在,如果你看看
action >>= f
Run Code Online (Sandbox Code Playgroud)
它意味着执行IO返回输出(比如out类型a)的动作,并将输出传递给f类型a -> IO b,因此f out是类型IO b.
如果你看看第二个函数有return哪个类型(再次为IOmonad 模拟)
return :: a -> IO a
Run Code Online (Sandbox Code Playgroud)
它需要纯粹的类型值a并给出类型的IO动作IO a.
现在让我们回顾一下fmap.
fmap1 f action
Run Code Online (Sandbox Code Playgroud)
执行IO操作然后f在操作的输出上运行,然后将输出转换为另一个IO类型的操作IO b.因此
fmap1 f action = action >>= g
where
g out = return (f out)
Run Code Online (Sandbox Code Playgroud)
现在出现了do符号的语法糖.这只是以>>=另一种方式编写绑定.
在do表示法中,您可以获取操作的输出
out <- action
Run Code Online (Sandbox Code Playgroud)
所以绑定只是简化为
action >>= f = do
out <- action
f out
Run Code Online (Sandbox Code Playgroud)
我想现在你将能够将fmap的定义转换为构造.
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |