Я был так сонлив, что написал следующий код (измененный, чтобы просто показать путаницу):
fac s = take 10 [s, s `mod` 1 ..]
maxFactor x = if (s == [])
then x
else head <-- this should be 'head x' instead of just 'head'
where s = fac x
Однако эта загрузка в ghci (и компиляция) просто прекрасна. Когда я выполнил maxFactor 1
, он жалуется (конечно):
<interactive>:0:1:
No instance for (Integral ([a0] -> a0))
arising from a use of `maxFactor'
Possible fix:
add an instance declaration for (Integral ([a0] -> a0))
In the expression: maxFactor 1
In an equation for `it': it = maxFactor 1
<interactive>:0:11:
No instance for (Num ([a0] -> a0))
arising from the literal `1'
Possible fix: add an instance declaration for (Num ([a0] -> a0))
In the first argument of `maxFactor', namely `1'
In the expression: maxFactor 1
In an equation for `it': it = maxFactor 1
Однако я не понимаю этого поведения:
fac
:
fac :: Integral a => a -> [a]
в то время как тип maxFactor
:
maxFactor :: Integral ([a] -> a) => ([a] -> a) -> [a] -> a
Не означает ли это следующее:
- первый вход в
fac
должен иметь типIntegral
(например,fac 10
); - так как в определении
maxFactor
существуетfac x
, x также должен быть класса typeclassIntegral
, таким образом, типmaxFactor
начинался бы с чего-то вродеmaxFactor :: (Integral a) => a ->
... затем что-то еще? Однако, если это так, то почему этот код компилируется, поскольку возвратmaxFactor
может бытьx
илиhead
, который, следуя этой строке рассуждений, не имеет одного и того же типа?
Что мне здесь не хватает?
Спасибо за любые вводы заранее!