1

我在 GHCi 中编写了一个快速的单行代码,并尝试用 map 组合总和。我认为它失败的原因是因为 map 给出了一般类型 [b] 的输出,而 sum 接受特定输入 Num a => [a]。但是,假设 map 函数的输出类型为 Num b => [b],则这段代码没有任何问题。

我认为编写限制类型声明可能有效(尽管我猜这会阻止您在 GHCi 中这样做),但它仍然没有:

myFunc :: Num b => (a -> b) -> [a] -> b
myFunc = sum . map

给了我以下错误:

Couldn't match expected type `[[a] -> b]'
            with actual type `[a] -> [b]'
Expected type: (a -> b) -> [[a] -> b]
  Actual type: (a -> b) -> [a] -> [b]
In the second argument of `(.)', namely `map'
In the expression: sum . map

有没有办法做到这一点?也许我只是错过了一些明显的东西(Haskell 的新手)。

4

1 回答 1

5

sum . map不是您正在寻找的定义。请注意

 (.) :: (b -> c) -> (a -> b) -> a -> c

点运算符接受两个一元函数。它不起作用,因为map需要两个参数:

map :: (a -> b) -> [a] -> [b]

一种可能的解决方案是显式绑定map的第一个参数:

myFunc :: Num c => (a -> c) -> [a] -> c
myFucc f = sum . map f

或者,您可以使用curryanduncurry并获得相同的结果。

myFunc = curry $ sum . uncurry map
于 2011-12-31T08:11:08.880 回答