给该函数的定义 FMAP ::(A-> B) - > IO一个 - > IO bHaskell的函数定义IO
其是通过将所述函数应用于变换的相互作用的影响其结果。你应该使用do构造来定义它。
我该如何定义fmap?我不知道吗?
有人可以帮我吗?
谢谢〜!
给该函数的定义 FMAP ::(A-> B) - > IO一个 - > IO bHaskell的函数定义IO
其是通过将所述函数应用于变换的相互作用的影响其结果。你应该使用do构造来定义它。
我该如何定义fmap?我不知道吗?
有人可以帮我吗?
谢谢〜!
它看起来像作业或什么东西,所以我会给你足够的提示,让你可以自己工作的其他细节。
fmap1 :: (a -> b) -> IO a -> IO b
fmap1 f action =
action
是作为IO
动作和f
是从a
到b
因此键入a -> b
的功能。
如果您熟悉其类型为一元的绑定>>=
(简化IO
单子)
(>>=) :: IO a -> (a -> IO b) -> IO b
现在,如果你看一下
action >>= f
这意味着执行IO
动作返回的输出(称为a
类型的out
)并将输出传递到f
,其类型为a -> IO b
,因此f out
是IO b
。
如果你看一下所谓return
第二函数有一个类型(同样为运动简化的单子IO
)
return :: a -> IO a
这需要a
型的纯值,并给出IO a
类型的IO
作用。
现在让我们回顾fmap
。
fmap1 f action
其执行IO
操作,然后对动作的输出运行f
,然后将输出到IO b
类型的另一IO
动作。因此,
fmap1 f action = action >>= g
where
g out = return (f out)
现在来到do
符号的语法糖。这只是以另一种方式写入绑定>>=
。
在do
符号,你可以通过
out <- action
得到一个动作的输出,从而绑定只是减少了
action >>= f = do
out <- action
f out
我现在认为你将能够FMAP的定义转换为做构造。
您是否熟悉地图?
类型地图的是
地图::(A - > B) - >并[a] - >并[b]如果运行
地图
(* 5)[1 ,2,3]
你
[5,10,15]
地图的一点是给它一个转换函数的n和一个源列表,并让它将变换应用到列表中以获得结果列表。
map是列表的fmap。他们希望你为IO类型编写一个fmap,这有帮助吗?
如果您想了解更多关于FMAP阅读http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass
注意每个单子是已经是仿函数。但是,如果你想重新实现fmap
,你可以很容易地用单子函数来实现。一个monad law是这样的:
fmap f xs = xs >>= return . f
如果你了解做记号的话,你应该能够把这种自己。如果没有,请问。
你对Functors和Monads的熟悉程度如何? – phg