作为模式"设计地图"例子不工作

时间:2017-12-20 04:38:22

标签: haskell

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]

但我该如何解决?

1 个答案:

答案 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) * xf = (*) . sum

contrivedMap ((*) . sum) [1,2,3]返回[6,10,9],即:

[(sum [1,2,3]) * 1, (sum [2,3]) * 2, (sum [3]) * 3]