6

rs最初の where セクションの定義の何が問題になっていますか?

palindrome :: [a] -> [a]

palindrome xs = con xs rs
    where con a b = rev (rev a []) b
        rs = rev xs                        -- here
        where rev [] rs = rs
            rev (x:xs) rs = rev xs (x:rs)

私はちょうど Haskell を学んでいますが、その構文規則は私を混乱させます。エラーメッセージは

[1 of 1] Compiling Main             ( pelindrome.hs, interpreted )

pelindrome.hs:5:8: parse error on input `rs'
4

2 に答える 2

14

あなたのインデントは間違っていて、そこには1つしか入れられないと思いますwhere(私は非常に間違っている可能性があります。私はhaskellの男ではありません)。rev(空のリスト)への呼び出しに欠落している引数もありました:

palindrome :: [a] -> [a]
palindrome xs = con xs rs
    where con a b = rev (rev a []) b
          rs = rev xs []                       -- here
          rev [] rs = rs
          rev (x:xs) rs = rev xs (x:rs)

main = print (palindrome "hello")

プリントアウト:

"helloolleh"

これから理解しようと思います。とにかく、楽しんでください!

編集:今では完全に理にかなっています。それが正しいバージョンだと思います。Haskell のインデント規則については、Haskell のインデントを参照してください。

于 2009-01-05T11:27:38.087 に答える
0

@litb: 途中で con を書き直すことができます

palindrome :: [a] -> [a]
palindrome xs = con xs rs
    where con [] b = b
          con (x:xs) b = x:con xs b
          rs = rev xs []                       -- here
          rev [] rs = rs
          rev (x:xs) rs = rev xs (x:rs)

これがプレリュードでの ++ の実装方法です。私の以前のバージョンは、末尾呼び出し方式 (Erlang など) で非遅延関数型または論理型言語でそれを記述する方法です。

于 2009-01-06T18:17:15.357 に答える