Haskell中的高阶函数 - “没有......的实例”

时间:2013-02-28 17:54:33

标签: haskell

map2采用两个列表,ls1和ls2以及一个函数F,并返回一个与ls1和ls2中最短的长度相同的列表,其中第i个元素是将F应用于第i个元素的结果ls1和ls2(按此顺序)

module Map2 where

map2 lst1 lst2 f = map2_iter lst1 lst2 f len 0 []
    where len = (min (length lst1), (length lst2))
map2_iter (x:lst1) (y:lst2) f len i acc = if (i == len)
                      then acc
                      else let res = (f x y) in
                      map2_iter (lst1) (lst2) (f) (len) (i+1) ((res):acc)
map2_iter [] [] f len i acc = []

我收到以下错误

Map2.hs:3:20:
No instances for (Eq (Int -> Int), Num (Int -> Int, Int))
  arising from a use of `map2_iter'
Possible fix:
  add instance declarations for
  (Eq (Int -> Int), Num (Int -> Int, Int))
In the expression: map2_iter lst1 lst2 f len 0 []
In an equation for `map2':
    map2 lst1 lst2 f
      = map2_iter lst1 lst2 f len 0 []
      where
          len = (min (length lst1), (length lst2))

我不确定这个错误意味着什么。任何人都可以提供任何帮助吗?

此外,这不是hw,而是测试预备。

1 个答案:

答案 0 :(得分:4)

错误消息告诉您无法比较Int -> Int函数是否相等以及(Int -> Int, Int)元组不是数字。为什么告诉你这个?因为您的代码中的len(Int -> Int, Int)元组,并且您尝试将其进行比较以获得相等性并将其视为数字。

那么len怎么会成为一个数字呢? (,)用于在Haskell中创建元组。编写(x,y)会创建一个元组,其第一个元素为x,其第二个元素为y。因此(min (length lst1), (length lst2))会创建一个元组,其第一个元素为min (length lst1),其第二个元素为length lst2。所以最终得到一个包含函数的元组(因为min (length lst1)求值为函数)和数字。

PS:我还应该指出,像你一样以递归的方式编写这个函数并不是一个好主意。编写它的方式,在生成整个结果之前,您将无法访问结果的第一个元素(结果列表的顺序也是错误的)。以更“天真”的非尾递归方式编写它将更加懒惰,因此表现更好。它也会更简单。