Haskell:用一般类型编写特定类型的函数?

时间:2011-12-31 07:30:18

标签: haskell types syntax typeclass function-composition

我在GHCi中写了一个快速的单行,并尝试用地图组合和。我认为它失败的原因是因为map给出了一般类型[b]的输出,而sum取得了特定输入Num 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新手)。

1 个答案:

答案 0 :(得分: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

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

myFunc = curry $ sum . uncurry map