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,而是测试预备。
答案 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)
求值为函数)和数字。