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

alk*_*652 1 syntax haskell types typeclass function-composition

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

我认为写一个限制类型声明可能会起作用(虽然我猜这会阻止你在GHCi中这样做)但它仍然没有:

myFunc :: Num b => (a -> b) -> [a] -> b
myFunc = sum . map
Run Code Online (Sandbox Code Playgroud)

给我以下错误:

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
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?也许我只是缺少一些明显的东西(Haskell新手).

Jan*_*Jan 5

sum . map不是您正在寻找的定义.观察那个

 (.) :: (b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)

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

map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

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

myFunc :: Num c => (a -> c) -> [a] -> c
myFucc f = sum . map f
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用curryuncurry实现相同的结果.

myFunc = curry $ sum . uncurry map
Run Code Online (Sandbox Code Playgroud)

  • 另一个无点定义是`(sum.).map`或`sum.:map`其中`(.:) =(.).(.)`. (3认同)