2012-09-29 87 views
-3

给该函数的定义 FMAP ::(A-> B) - > IO一个 - > IO bHaskell的函数定义IO

其是通过将所述函数应用于变换的相互作用的影响其结果。你应该使用do构造来定义它。

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

有人可以帮我吗?

谢谢〜!

+0

你对Functors和Monads的熟悉程度如何? – phg

回答

6

它看起来像作业或什么东西,所以我会给你足够的提示,让你可以自己工作的其他细节。

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

action是作为IO动作和f是从ab因此键入a -> b的功能。

如果您熟悉其类型为一元的绑定>>=(简化IO单子)

(>>=) :: IO a -> (a -> IO b) -> IO b 

现在,如果你看一下

action >>= f 

这意味着执行IO动作返回的输出(称为a类型的out)并将输出传递到f,其类型为a -> IO b,因此f outIO 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的定义转换为做构造。

+0

非常感谢!我认为你的代码的最后部分应该返回(f out),对吧?不f出 – Chwa

+0

@Justin那有关系吗?尝试运行并看看。 – Satvik

2

您是否熟悉地图?

类型地图的是

地图::(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

1

注意每个单子是已经是仿函数。但是,如果你想重新实现fmap,你可以很容易地用单子函数来实现。一个monad law是这样的:

fmap f xs = xs >>= return . f 

如果你了解做记号的话,你应该能够把这种自己。如果没有,请问。