繁体   English   中英

使用仿函数在 Haskell 中操作数据列表

[英]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.

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