2012-01-26 3 views
4

Я новичок в haskell и использую последний GHCi 2011.2.0.1. Одно разочарование, с которым я сталкиваюсь, часто состоит в том, что очень часто примеры в Интернете и книгах (даже с официального сайта haskell.org, например пример-2 из http://www.haskell.org/haskellwiki/State_Monad) не компилируются. И это требует нескольких раундов охоты и размещения вопросов, чтобы выяснить, в чем проблема. Даже некоторые из примеров из книги RWH не работают.Примеры haskell часто не работают

Это проблема с новой версией haskell или платформы haskell? Развиваются ли языки/платформа и нестабильны, или только примеры устарели? В любом случае, что лучший способ для нового ученика найти правильные примеры, чтобы учиться?

В частности, вы можете помочь исправить пример государственной монады, упомянутый выше?

+0

Я знаю, что есть несколько книг о хеккеле, в которых используются объятия, которые являются стабильной версией Haskell. Возможно, больше в этом поможет. Удачи. – wespiserA

+3

@wespiserA: А? Hugs был в последний раз обновлен в 2006 году и не реализует последний стандарт Haskell. Я думаю, он стабилен в том, что он никогда не меняется, но он также не будет работать с большинством современных библиотек. – ehird

+5

Как я уже говорил, RWH вышел не в то время, по крайней мере, в пару чувств. Перед некоторыми крупными изменениями (исключениями, mtl/transformers) перед некоторыми крупными библиотеками, которые теперь могут быть предпочтительнее, чем те, которые использовались в книге (например: attoparsec), а также до некоторых небольших, но значительных изменений («instance Monad Либо изменился и переместился). Это никоим образом не означает стук в книгу, но, поскольку соглашение с авторами относится к второму изданию и вашему вопросу о скорости изменения языка (как это реализовано и практикуется - спецификация и ядро ​​стабильны). –

ответ

9

В этом случае проблема заключается в том, что конструктор State был удален в новейшей версии Monad Transformer Library. Если вы замените использование State в определении getNext с state, то программа работает нормально. (Это связано с тем, что State был переопределен как StateT Identity, т. Е. Государственный монадный трансформатор над тождественной монадой, и поэтому отдельный тип данных был удален. Если вы не знаете, что это значит, не беспокойтесь об этом, просто означает, что вы должны заменить Statestate всякий раз, когда вы его видите.)

Большинство проблем с существующими примерами в Интернете или в RWH происходит просто из-за новых версий библиотек. (Я думаю, что основная проблема с примерами RWH заключается в том, что примеры Parsec написаны для Parsec 2, Parsec 3 изменился совсем немного, поэтому, по крайней мере, вам, вероятно, потребуется добавить некоторые импортные товары.)

В целом, Haskell страдает от нехватки актуальных и полезных ресурсов; что страница HaskellWiki просто не поддерживается. (Хотя HaskellWiki действительно является официальным сайтом haskell.org, страницы написаны и поддерживаются пользователями, поэтому только потому, что что-то в вики не обязательно означает, что оно соответствует современному или высокому качеству.)

Релиз Monad Transformer Library, который удалил State, был выпущен в октябре 2010 года, так что обидно, что по-прежнему существует много кода, который не работает с новой версией из-за этого. К счастью, исправление прост.

+0

Большое спасибо, это было очень полезно. Это действительно позор, что обновления кода 2010 года все еще не отражены в вики, а книга RWH также устарела. Новые ученики очень определенно нуждаются в новой книге, чтобы узнать haskell. Есть ли другая книга/документация? – R71

+1

Мне нравится [Learn you a Haskell] (http://learnyouahaskell.com/) (хотя у него также есть 'State' в его коде), но в RWH нет ничего плохого; по-видимому, авторы рассматривают возможность написания нового издания.mtl 2 и Parsec 3 являются единственными крупными изменениями, которые повлияют на, в основном, обновленный вводный учебник, о котором я могу думать, а изменения для получения кода, работающего с ними, должны быть незначительными. – ehird

+1

Я только что исправил эту ошибку в вики. Не стесняйтесь получать учетную запись и исправлять вещи, когда сталкиваетесь с ними. –