Во-первых, похоже, что вы используете довольно старую версию GHC. В более новых версиях синтаксис GHCi немного смягчен.
Но все же: то, что вы вводите в GHCi, делает не по тем же правилам, что вы пишете в исходном файле Haskell. В частности, приглашение GHCi по сути является оценщиком цепочек монад IO, причина в том, что вы можете написать что-то вроде
Prelude> putStrLn "Hello"
Hello
или
Prelude> readFile "test.txt"
"fubar\nbaz"
и на самом деле выполнить правильноесть . Напротив, в исходном файле на Haskell вы только объявляете привязки , и они затем могут быть вызваны в действии main
или сеансе GHCi.
Но в этом случае вы хотитеобъявить привязку в самом GHCi. Вы можете сделать это тоже, но это немного неловко, в основном вам нужно начать с let
, а затем сжать все в одну строку:
Prelude> let fact :: Int -> Int; fact n = product [1..n]
На самом деле , более новая версия GHCi позволяет вам опустить let
, и вы можете иметь многострочные определения, используя специальный синтаксис скобок:
Prelude> :{
Prelude| fact :: Int -> Int
Prelude| fact n = product [1..n]
Prelude| :}
, но я бы рекомендовал против этого. Если у вас действительно есть большие определения, лучше поместите их в правильный источник на Haskell и загрузите в GHCi.