Haskell Wikibook定义了这个函数:
contrivedMap :: ([a] -> a -> b) -> [a] -> [b]
contrivedMap f [] = []
contrivedMap f list@(x:xs) = f list x : contrivedMap f xs
我尝试使用它时遇到错误:
> contrivedMap (*2) [1,2,3]
<interactive>:4:15: error:
• Couldn't match type ‘[a0]’ with ‘a0 -> b’
Expected type: [a0] -> a0 -> b
Actual type: (a0 -> b) -> a0 -> b
• In the first argument of ‘contrivedMap’, namely ‘(* 2)’
In the expression: contrivedMap (* 2) [1, 2, 3]
In an equation for ‘it’: it = contrivedMap (* 2) [1, 2, 3]
• Relevant bindings include it :: [b] (bound at <interactive>:4:1)
我发现这些类型不匹配:
> :t (*2)
(*2) :: Num a => a -> a
> :t contrivedMap
contrivedMap :: ([a] -> a -> b) -> [a] -> [b]
但我该如何解决?
答案 0 :(得分:2)
我发现它们不匹配,但我该如何解决?
您可以通过正确使用此功能来修复它。
你定义了一个函数mapEx
,它迭代列表的元素并在每个元素上应用提供的函数,i。即你需要提供一个函数,它接受一个列表的元素并返回一个结果。例如(*2)
- 获取Num
并返回加倍值。
预期地:
mapEx (*2) [1,2,3]
的评估结果为[2, 4, 6]
但contrivedMap
功能略有不同。它还迭代列表的元素,但提供的函数将 2 参数从迭代元素到结尾的元素列表和迭代元素< /强>
contrivedMap f [1,2,3]
将包含:
[(f [1,2,3] 1), (f [2,3] 2), (f [3] 3)]
因此,你需要提供与这些参数一起正常工作的函数,i。即类型为([a] -> a -> b)
。例如,f list x = (sum list) * x
或f = (*) . sum
contrivedMap ((*) . sum) [1,2,3]
返回[6,10,9]
,即:
[(sum [1,2,3]) * 1, (sum [2,3]) * 2, (sum [3]) * 3]