【问题标题】:Haskell: Compose a function of specific type with one of general type?Haskell:用通用类型组合一个特定类型的函数?
【发布时间】:2011-12-31 07:30:18
【问题描述】:

我在 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 的新手)。

【问题讨论】:

  • 试试myFunc f = sum . map f(.) 组成“一元”函数。

标签: haskell types syntax typeclass function-composition


【解决方案1】:

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

【讨论】:

  • 另一个无点定义是(sum .) . mapsum .: map 其中(.:) = (.) . (.)
  • "点运算符接受两个一元函数。它不起作用......" 所有函数在技术上都是一元函数; “多参数”函数只是返回其他函数的一元函数。所以它“不起作用”,因为 map 需要两个参数;它只是以不同于 OP 预期的方式工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 2011-03-08
相关资源
最近更新 更多