给出函数的定义 fmap ::(a-> b) - > IO a - > IO b
其效果是通过将函数应用于其结果来转换交互。你应该使用do构造来定义它。
我该如何定义fmap?我不知道吗?
有人可以帮助我吗?
感谢〜!
答案 0 :(得分:6)
它看起来像家庭作业或其他什么,所以我会给你足够的提示,以便你自己可以完成其余的细节。
fmap1 :: (a -> b) -> IO a -> IO b
fmap1 f action =
action
为IO
行为,f
为a
至b
的函数,因此类型为a -> b
。
如果您熟悉monadic bind >>=
,它具有类型(简化为IO
monad)
(>>=) :: IO a -> (a -> IO b) -> IO b
现在,如果你看看
action >>= f
这意味着执行IO
操作,该操作返回输出(例如out
类型的a
)并将输出传递给类型为{{1}的f
因此a -> IO b
的类型为f out
。
如果你看一下名为IO b
的第二个函数,它具有类型(再次为return
monad进行了简化)
IO
它采用return :: a -> IO a
类型的纯值,并提供a
类型的IO
操作。
现在让我们回顾一下IO a
。
fmap
执行fmap1 f action
操作,然后在操作的输出上运行IO
,然后将输出转换为f
类型的另一个IO
操作。因此
IO b
现在出现了fmap1 f action = action >>= g
where
g out = return (f out)
符号的句法糖。这只是以另一种方式编写绑定do
。
在>>=
表示法中,您可以通过
do
所以bind只是简化为
out <- action
我认为现在您可以将fmap的定义转换为构造。
答案 1 :(得分:2)
你熟悉地图吗?
地图的类型是
map ::(a - &gt; b) - &gt; [a] - &gt;并[b]
如果你跑
地图(* 5)[1,2,3]
你得到了
[5,10,15]
地图的目的是为它提供变换函数和源列表,并将变换应用于列表以获得结果列表。
map是列表的fmap。他们希望你为IO类型编写一个fmap,这有帮助吗?
如果您想了解更多有关fmap read http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass
的信息答案 2 :(得分:1)
请注意,每个monad都已经是一个仿函数。但是,如果要重新实现fmap
,则可以轻松地根据monadic函数执行此操作。一个monad law就是这个:
fmap f xs = xs >>= return . f
如果你理解了表示法,你应该能够自己翻译。如果没有,请问。