haskell函数定义IO

时间:2012-09-29 11:03:49

标签: haskell io

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

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

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

有人可以帮助我吗?

感谢〜!

3 个答案:

答案 0 :(得分:6)

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

fmap1 :: (a -> b) -> IO a -> IO b 
fmap1 f action = 

actionIO行为,fab的函数,因此类型为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

如果你理解了表示法,你应该能够自己翻译。如果没有,请问。