发生检查:无法构造无限类型:a0 = [a0]

时间:2014-03-13 21:13:47

标签: haskell

mymap f _ [] =  []
mymap f x (y:ys) =  f first y : mymap (f x ys)
    where if x /= [] first = head(x) else --there will not be else just playing around

我想做的只是实现内置地图,而不是一个列表,f有2个参数(列表)。当ys变为[]时,我想创建一个新的列表,(通过调用mymamp)但是我想使用tail(x)== xs并继续使用tail,直到xs变为[]。并将所有这些列表列入最终列表。但是我无法找到一种自动/递归方式来实现它。

1 个答案:

答案 0 :(得分:1)

首先,您在没有确认head(x)不是空的情况下调用x - 这不是一个好主意。相反,也可以在x上使用模式匹配!

mymap f _ [] =  []
mymap f (x:xs) (y:ys) =  f x y : f x ys
-- add the other cases as well

现在,错误:请注意您已将f用于地点:

  1. f first y - 此处f的类型为a->b->c

  2. f x ys - 此处f的类型为[a]->[b]->c

  3. Haskell无法推断f的类型,因此它进行了有根据的猜测并且无法推断另一个变量的类型 - 因此错误。

    在这种情况下最好的建议 - 向mymap添加类型签名。 Haskell是一种智能语言,在大多数情况下,它可以在没有您的类型签名的情况下管理得很好 - if ,如果,那就是,#&#> 39;重新编码有效。所以总是从类型签名开始。