Haskell:Почему нет несоответствия типов (и почему это компилируется)?

Я был настолько сонным, что написал следующий код, (модифицированный, чтобы просто показать путаницу):

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

не это означает, что следующий:

  1. первый ввод в facдолжен относиться к классу типов Integral(, например,fac 10);
  2. поскольку в определении maxFactorесть fac x, x также должен иметь класс типов Integral, таким образом, тип maxFactorбудет начинаться с чего-то вроде maxFactor :: (Integral a) => a ->... тогда что-то еще? Однако, если это так, то почему этот код компилируется, так как возврат maxFactorможет быть xили head, который, следуя этой линии рассуждений, не имеет того же типа?

Что я здесь упускаю?

Заранее спасибо за любую информацию!

11
задан crockeea 11 April 2012 в 08:24
поделиться