haskell函数定义IO

J.L*_*J.L -3 io haskell

给出函数fmap ::(a-> b) - > IO a - > IO b的定义

其效果是通过将函数应用于其结果来转换交互.你应该使用do构造来定义它.

我该如何定义fmap?我不知道吗?

有人可以帮助我吗?

谢谢〜!

Sat*_*vik 6

它看起来像家庭作业或其他什么,所以我会给你足够的提示,以便你可以自己完成其余的细节.

fmap1 :: (a -> b) -> IO a -> IO b 
fmap1 f action = 
Run Code Online (Sandbox Code Playgroud)

action是作为IO动作和f是从函数ab,因此类型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的定义转换为构造.