繁体   English   中英

在haskell中获取函数作为参数

[英]Get function as parameter in haskell

我不知道这个,我有一个叫做Enumeration的类型

> 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函数的BinaryTrees.lhs:91:14: Parse error in pattern: m

我正在尝试获取第一个枚举Enumeration a作为它的函数(Int和[a])

您不能对函数进行模式匹配,但不必这样做:

> 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)

一个可能的解决方案可能是

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都是函子。

此类练习的主要“技巧”是更多地考虑类型而不是实际值。

如果您是初学者,这可能会有点晦涩。 但是,一旦您对函子更加熟悉,这将变得很自然。

(非常习惯这种风格的人甚至可以用一些模糊的注解“ functors compose”来暗示这种解决方案,让您自己弄清楚到底是怎么回事。当发生这种情况时,请不要放弃-最终它将变得有意义; -))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM