Я был настолько сонным, что написал следующий код, (модифицированный, чтобы просто показать путаницу):
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 также должен иметь класс типов Integral
, таким образом, тип maxFactor
будет начинаться с чего-то вроде maxFactor :: (Integral a) => a ->
... тогда что-то еще? Однако, если это так, то почему этот код компилируется, так как возврат maxFactor
может быть x
или head
, который, следуя этой линии рассуждений, не имеет того же типа?Что я здесь упускаю?
Заранее спасибо за любую информацию!