Я думаю, что вы делаете распространенную ошибку новичка, путая то, что вы можете написать внутри repl из ghci и что вы пишете в исходном файле на haskell.
Все интерпретаторы sml сделаны таким образом, что вы можете записать любое объявление верхнего уровня в repl или поместить другими словами: все, что вы можете записать в файл sml, вы можете написать в интерпретатор sml. Таким образом, вам разрешено записать val foo = "bar"
в файл и использовать C-c C-b
для загрузки файла, и вам разрешено просто вставить val foo = "bar"
в интерпретатор.
С другой стороны, из-за того, как работает haskell, вы можете записать let foo = 42
в ghci, однако это недопустимое объявление верхнего уровня, и, следовательно, это не может быть в исходном файле haskell (сам по себе). С другой стороны, вы можете иметь id n = n
в исходном файле haskell и использовать C-c C-l
для загрузки файла, однако вы не можете записать это непосредственно в ghci (вы получите ошибку:: 1: 6: ошибка разбора на введите '='). Причина этого в том, что repl в ghci выполняется в монаде IO, и поэтому все, что вы пишете в ghci, должно выполняться с использованием нотации do. Я могу только порекомендовать вам прочитать Интерактивная оценка по приглашению из Руководства пользователя Using GHCi.
C-c C-b
в режиме sml - это то же самое, что и C-c C-l
в режиме haskell, по крайней мере концептуально. Я не знаю много о внутренностях haskell-mode, но в sml-mode C-c C-b
выполняет некоторый sml-код в интерпретаторе, обычно это функция use(...)
. В режиме haskell он, кажется, просто выполняет команду :load "..."
ghci