2010-05-17 25 views
130

我試圖定義任何簡單的功能跨越了ghci多行,採取以下爲例:如何在多行中定義ghci中的函數?

let abs n | n >= 0 = n 
      | otherwise = -n 

到目前爲止,我已經試過壓在第一行後回車:

Prelude> let abs n | n >= 0 = n 
Prelude>   | otherwise = -n 
<interactive>:1:0: parse error on input `|' 

我也試圖利用:{:}命令,但我不明白遠:

Prelude> :{ 
unknown command ':{' 
use :? for help. 

我定義g HC交互版本6.6在Linux上的Haskell 98,我錯過了什麼?

+19

請升級您的GHC安裝。 GHC 6.6將近5歲!最新版本的Haskell在這裏:http://haskell.org/platform – 2010-05-17 01:30:17

+0

可能重複[GHCi中的多行命令](http://stackoverflow.com/questions/8443035/multi-line-commands-in- ghci) – Mark 2014-05-07 11:22:22

+0

@Mark此OP已經嘗試解決這個問題。這個問題是由於一個過時的ghci,而不是缺乏什麼知識。解決方法:升級。解決方法:使用':{',':}'。 – AndrewC 2014-05-08 15:13:40

回答

112

警衛(如你的例子),你可以把他們都在同一行,它工作(警衛不關心間距)

let abs n | n >= 0 = n | otherwise = -n 

,如果你想要寫有多重定義的函數在參數模式匹配,就像這樣:

fact 0 = 1 
fact n = n * fact (n-1) 

那麼你可以使用大括號用分號分隔定義

let { fact 0 = 1 ; fact n = n * fact (n-1) } 
7

如果你不想升級GHC只是:{:},你需要它寫在一行:

> let abs' n | n >= 0 = n | otherwise = -n 

我m不知道Haskell中的任何單個定義,必須在多行上寫入。以上確實在GHCI工作:

> :t abs' 
abs' :: (Num a, Ord a) => a -> a 

對於其他表達式,如do塊,你就需要使用非佈局語法與花括號和分號(eugh)。

43

丹是正確的,但:{:}必須在每個出現在自己的行:

> :{ 
> let foo a b = a + 
>   b 
> :} 
> :t foo 
foo :: (Num a) => a -> a -> a 

這也與佈局規則交互,所以採用DO-符號時,它可能會更容易使用大括號和半明確地冒號。例如,這個定義失敗:

> :{ 
| let prRev = do 
| inp <- getLine 
| putStrLn $ reverse inp 
| :} 
<interactive>:1:18: 
    The last statement in a 'do' construct must be an expression 

但它工作時,添加括號和分號:

> :{ 
| let prRev = do { 
| inp <- getLine; 
| putStrLn $ reverse inp; 
| } 
| :} 
> :t prRev 
prRev :: IO() 

這會從文件粘貼定義時,只有真正的問題,其中壓痕可能會改變。

+0

如果您有一行以'='結尾的行(下一行的定義如下),至少在版本7.6.3中不起作用。 – AdamC 2014-05-22 14:15:26

+0

也許這失敗了,因爲let的第二行和第三行沒有縮進......? (另外兩個空格。) – Evi1M4chine 2016-05-08 02:44:55

195

GHCi現在有一個多行輸入模式,啓用:set + m。例如,

Prelude> :set +m 
Prelude> let fac 0 = 1 
Prelude|  fac n = n * fac (n-1) 
Prelude| 
Prelude> fac 10 
3628800 
+29

設置多行模式使'ghci'在這方面的行爲與Python解釋器非常相似。很方便!實際上,您可以在您的主目錄中創建一個'.ghci'文件,在該文件中,您每次啓動'ghci'時將':set + m'和多行模式設置爲默認值! – kqr 2013-11-05 21:04:49

+2

這真的很棒。但是我注意到,當我使用':set prompt「λ」'設置提示符時,續行表示'Prelude'而不是'λ'。任何方式來解決這個問題? – abhillman 2014-06-18 06:02:36

+2

請參閱此處以獲取定義新延續提示的補丁https://ghc.haskell.org/trac/ghc/ticket/7509#no1 – karakfa 2014-06-18 13:22:56

相關問題