13
pow1 b e  
| (e == 0)  = 1  
| otherwise = b * pow1 b (e-1)

.hs ファイルにまさにそのコードがあり、読み込み時に常に同じ解析エラーが発生します。実際には間違いが含まれているとは思わないので、現在考えているのは「|」sign は haskell が望んでいるものではありませんが、私の Macbook キーボード (Mac OS を使用) の標準的なものです。それは可能ですか?私は現在、プレーンテキスト設定をオンにして、TextEdit を使用してコードを記述しています。

4

4 に答える 4

17

ガードは必ずインデントしてください。Haskell には重要な空白があります。

pow1 b e
    | (e == 0)  = 1
    | otherwise = b * pow1 b (e-1)
于 2013-03-29T22:40:56.293 に答える
10

ガードの前にスペースを追加するだけで、コードは正常に機能します。

pow1 b e  
    | (e == 0)  = 1  
    | otherwise = b * pow1 b (e-1)

(user142019はすでにこの解決策を述べていますが、解決策を理解するには説明が必要だと感じました)

説明:

Haskell はスペースインデントを使用して、コードの構造とスコープを制御します。他のプログラミング言語 (Java など) はこれを行うために中括弧に依存していますが、Haskell には代わりにインデントがあります。

Haskell は、関数本体が関数定義よりも深いインデント レベルにあり、他の関数定義が同じレベルにあると想定しているため、コードが機能しません。同じインデント レベルの新しい行は新しい関数定義として解釈されようとしますが、ガードで開始することは許可されていない|ため、解析エラーが発生します。

Mac の文字キーやテキスト エディターに問題はありません。

インデントのトピックについて: タブは機能しません。そのため、スペースを手動で入力するか、エディターのタブ設定を変更して、タブ文字の代わりに 4 つのスペース (推奨) を挿入する必要があります。(たとえば、Notepad++ ではこれが可能です。Haskell で使用する場合は、これを選択するのが私の好みです)。

于 2014-07-29T10:59:22.073 に答える
2

インデントを覚えていることに加えて、私が最初に Haskell を始めた Web サイトで次の文を見ました。

関数名とそのパラメーターの直後、最初のガードの前に = がないことに注意してください。多くの初心者は、時々そこに置くため、構文エラーを取得します。

これも重要です。

@Greg Haskell はタブ文字を認識しません'\t'。インデント/フォーマットするときは、タブの代わりにスペースを使用してください。

于 2019-07-30T13:31:23.237 に答える