[英]Manipulating data lists in Haskell with functors
我有一个数据类型定义如下:
data AssocList k a =
Nil
| Cons(k,a,AssocList k a)
deriving (Eq,Show)
现在我有一些代码如下:
doubleMap :: (k -> a -> (k',a')) -> AssocList k a -> AssocList k' a'
doubleMap f Nil = Nil
doubleMap f (Cons(k, a, t)) = Cons(k , f k a, doubleMap f t)
该代码预计将接受三个输入 k、a 和 AssocList,AssocList 看起来像这样:
(Cons(1,2,Cons(3,4,Cons(....))))
应该发生的是 f 是一个高阶函数,它返回 (k', a') 的元组,然后我将遍历整个 Cons 列表并将 k' 应用于 Cons 中的每个第一个参数,然后应用a' 到 Cons 内的每个第二个agrument
所以如果我像这样调用函数:
doubleMap (\x y -> (x,x+y)) (Cons(1,2,Cons(3,4,Nil)))
我希望得到:
Cons(1,3,Cons(3,7,Nil))
现在,如果我使用上面实现的解决方案:
doubleMap :: (k -> a -> (k',a')) -> AssocList k a -> AssocList k' a'
doubleMap f Nil = Nil
doubleMap f (Cons(k, a, t)) = Cons(k , f k a, doubleMap f t)
我收到以下错误:
Couldn't match type ‘a'’ with ‘(k', a')’
Expected: AssocList k (k', a')
Actual: AssocList k' a'
你能告诉我实现这个功能的正确方法吗?
当您编写 Cons(k, fka, doubleMap ft) 时,请记住,f 的类型为 (k -> a -> (k', a')),结果为 (k', a'),但不是 a'。 结果,您得到 Cons(k', (k', a'), doubleMap ft) 而不是 Cons(k', a', doubleMap ft)。
考虑到这一事实重写了 doubleMap :
doubleMap :: (k -> a -> (k',a')) -> AssocList k a -> AssocList k' a'
doubleMap f Nil = Nil
doubleMap f (Cons(k, a, t)) = let (k', a') = f k a in Cons (k', a', doubleMap f t)
Ps 通常类型定义是这样写的(类型构造函数中没有元组):
data AssocList k a = Cons k a (AssocList k a) | Nil
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.