質問
最初のwhereセクションの rs
定義の何が問題になっていますか?
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'
解決
インデントが間違っていたので、 where
を1つだけ持つことができると思います(非常に間違っている可能性があります。私は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インデント
をお読みください。他のヒント
@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など)で記述する方法です。
所属していません StackOverflow