Я изучал некоторые основные функции композиции в Haskell, и пока я играл, я понял то, что я не могу объяснить. Когда я использую следующий блок кода компилятор, кажется, чтобы быть счастливым об этом, и работает отлично:Haskell и функциональная композиция
doSomeX x = if x==7 then True else False
doSomeY (x,y) = x+y+1
doSomeXY = doSomeX.doSomeY
Однако, когда я разделить doSomeY на 2 арг вместо пары, а именно:
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
имеет тот же тип, что и аргумент arg функции doSomeX
, почему бы ввести тип ввода doSomeY
? Я пропустил что-то принципиальное здесь?
Благодаря
Вы видите, почему с эквивалентом 'doSomeY x = \ y -> x + y + 1'? – molbdnilo