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新手).
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)
myFunc = curry $ sum . uncurry map
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
210 次 |
| 最近记录: |