182

ghciの複数の行にまたがる単純な関数を定義しようとしています。例として以下を取り上げます。

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

これまでのところ、最初の行の後でEnterキーを押してみました。

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

:{また、 andコマンドを使用しようとしました:}が、うまくいきません。

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

Linux上のHaskell98にGHCInteractiveバージョン6.6を使用していますが、何が欠けていますか?

4

7 に答える 7

284

GHCiに複数行入力モードが追加され、:set+mで有効になりました。例えば、

Prelude> :set +m
Prelude> let fac 0 = 1
Prelude|     fac n = n * fac (n-1)
Prelude|
Prelude> fac 10
3628800
于 2013-11-05T20:43:21.570 に答える
137

ガード(あなたの例のように)の場合、それらをすべて1行に配置するだけで、機能します(ガードは間隔を気にしません)

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) }
于 2010-05-17T04:10:31.680 に答える
69

ダンは正しいですが、それぞれが独自の行に表示される必要が:{あります。:}

> :{ 
> 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 ()

これは、インデントが変更される可能性があるファイルから定義を貼り付ける場合にのみ実際に問題になります。

于 2010-08-20T15:46:56.560 に答える
20

見た目:{:}かなり新しい機能です。GHCのアップグレードが必要になる場合があります。

編集:確認済み、http ://www.haskell.org/ghc/docs/6.8.2/html/users_guide/release-6-8-2.htmlを参照

于 2010-05-17T00:24:49.557 に答える
8

:{とだけでGHCをアップグレードしたくない場合は:}、すべてを1行で記述する必要があります。

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

Haskellで複数行に書かなければならない単一の定義を私は知りません。上記は確かにGHCiで機能します:

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

ブロックなどの他の式のdo場合は、中括弧とセミコロンを使用した非レイアウト構文を使用する必要があります(eugh)。

于 2010-05-17T00:39:55.137 に答える
2

両方の行を一度に貼り付けるか、新しい行ごとにcontrol-enterを使用すると、少なくともhttps://repl.it/languages/haskellですべてがまとめられているように見えます。2行目の先頭に2つのドットが表示されます。または、ファイルに入れて:ファイルをロードします(:lmain)。なぜabsは負の数で機能しないのですか?ああ、あなたは数字の周りに括弧を入れなければなりません。

   let abs n | n >= 0 = n 
..           | otherwise = -n
   abs (-1)
于 2020-07-14T13:50:22.633 に答える
0

macOSCatalina10.15.2でGHCiバージョン8.2.1を使用しています。以下は、関数型宣言とガードの両方を組み合わせる方法です。左側の縦棒はGHCiの複数の線用であることに注意してください。

λ: let abs' :: (Num a, Ord a) => a -> a
 |     abs' n | n >= 0 = n | otherwise = -n
 | 
λ: abs' 7
7
λ: abs' (-7)
7
于 2019-12-15T11:26:25.050 に答える