2016-02-28 47 views
0

我想不通这一点,我有一个名为枚举获取功能参数在Haskell

> type Enumeration a = Int -> [a] 

类型,我需要映射了它。我写了这以下功能:

> imapE :: (a -> b) -> Enumeration a -> Enumeration b 
> imapE f (m fa) = \n -> imapF f fa 

其中imapF这样定义:

> imapF :: (a -> b) -> [a] -> [b] 
> imapF _ [] = [] 
> imapF f (x:xs) = f x : imapF f xs 

但是当我尝试加载我的代码,我得到以下错误BinaryTrees.lhs:91:14: Parse error in pattern: m关于我imapE功能。

我试图让第一枚举Enumeration a,因为它是函数(int和[A])

回答

3

你不能匹配很多功能,但是你没有做到这一点:

> imapE :: (a -> b) -> Enumeration a -> Enumeration b 
> imapE f g = (imapF f) . g 

(好吧,imapF真的只是map)。

在不使用.

> imapE :: (a -> b) -> Enumeration a -> Enumeration b 
> imapE f g = \n -> imapF f (g n) 
+0

@EliBraginskiy不,它会是'imapF f(gx)'。 '.'是函数组合,所以'f。 g = \ x - > f(g x)'。 – Bakuriu

2

一种可能的解决方案可以是

imapE :: (a -> b) -> Enumeration a -> Enumeration b 
imapE = map . map 

事实上,上面是相当于

imapE f = map (map f) 

其中

f :: a -> b 
map f :: [a] -> [b] 
map (map f) :: (Int -> [a]) -> (Int -> [b]) 

因为[](->) Int都是仿函数。

这种练习的主要“技巧”是思考更多关于类型而不是实际值。

如果你是初学者,这可能会感觉有些模糊。然而,一旦你更熟悉仿函数,这将变得非常自然。 (非常习惯于这种风格的人甚至可以用一些神秘的音符暗示这个解决方案“函数组成”,并让你找出真正发生的事情,当发生时,不要放弃 - 最终它将有道理;-))