【发布时间】:2016-01-12 23:16:22
【问题描述】:
我在 Haskell 中学习了一些基本的函数组合,当我在玩耍时,我意识到了一些我无法真正解释的东西。当我使用以下代码块时,编译器似乎对此很满意并且工作正常:
doSomeX x = if x==7 then True else False
doSomeY (x,y) = x+y+1
doSomeXY = doSomeX.doSomeY
但是,当我将 doSomeY 拆分为 2 个 args 而不是一对时,即:
doSomeX x = if x==7 then True else False
doSomeY x y = x+y+1
doSomeXY = doSomeX.doSomeY
我收到以下错误:
No instance for (Num a0) arising from a use of `doSomeY'
The type variable `a0' is ambiguous
Relevant bindings include
doSomeXY :: a0 -> Bool (bound at test.hs:21:1)
Note: there are several potential instances:
instance Integral a => Num (GHC.Real.Ratio a)
-- Defined in `GHC.Real'
instance Num Integer -- Defined in `GHC.Num'
instance Num Double -- Defined in `GHC.Float'
...plus three others
In the second argument of `(.)', namely `doSomeY'
In the expression: doSomeX . doSomeY
In an equation for `doSomeXY': doSomeXY = doSomeX . doSomeY
我真的不明白为什么。在这两种情况下,doSomeY 的返回类型与函数 doSomeX 的 arg 类型相同,为什么 doSomeY 的输入类型会有所不同?我在这里遗漏了一些基本的东西吗?
谢谢
【问题讨论】:
-
你明白为什么使用等效的
doSomeY x = \y -> x + y + 1了吗?
标签: haskell function-composition