Я не профессионал Haskell. Сегодня у меня был несколько странный опыт работы с системой типов сегодня. Вторая строка этого приведет к ошибке типа. Проблема заключается в maxdiag (as:bs:cs:ds)
бит второй линии:Typecheck weirdness со списками списков
maxdiag ((a:as):(b:bs):(c:cs):(d:ds):xs) len =
maximum [a*(bs !! 0)*(cs !! 1)*(ds !! 2), maxdiag (as:bs:cs:ds) (len-1)]
Он терпит неудачу со следующей ошибкой:
Occurs check: cannot construct the infinite type: a0 = [a0]
Expected type: [[a0]]
Actual type: [a0]
In the second argument of `(:)', namely `ds'
In the second argument of `(:)', namely `cs : ds'
Когда я изменить обижая часть второй линии maxdiag (as:bs:cs:ds:xs)
, так что он читает
maxdiag ((a:as):(b:bs):(c:cs):(d:ds):xs) len =
maximum [a*(bs !! 0)*(cs !! 1)*(ds !! 2), maxdiag (as:bs:cs:ds:xs) (len-1)]
... тогда нет ошибки. Аналогично, если я заменил его на maxdiag (as:bs:cs:(ds:xs))
, он будет успешным. Мои вопросы:
- Что означает эта ошибка?
- Почему это произошло?
- Почему эти две, казалось бы, разные вещи исправить?
+1 для последнего абзаца – amindfv
У меня не было другого контекста относительно функции (т. Е. Других паттернов), потому что я не хотел усложнять реальный вопрос, который не касается этих шаблонов. Но это не часть надежной программы или чего-то еще, я просто возился с системой типов, чтобы получить зависание ошибок. Я бы никогда не писал такой код. :П – apc