ここにはかなりの間違いがあります。チュートリアル(learn you a Haskell、Real World Haskell)を読んでもっと多くの時間を費やす必要があります。あなたはかなり近くにいるので、私はここでブレークダウンをしようとします。
do
は特別である - それは「不可欠モード」にはHaskellを切り替えていない、それはモナドを使用するときに明確なコードを書くことができます - あなたがまだあるかモナドわからない場合は、離れてdo
から滞在します! return
などのキーワードも、命令的言語と同じように動作しません。完全に新鮮な心でハスケルにアプローチしよう。
また、ハスケルでは、インデントが重要です。詳しくは、this linkを参照してください。基本的に、同じ "ブロック"内のすべての行に同じ字下げを付ける必要があります。
さて、do
とreturn
キーワードを取り除くみましょう、とインデントを揃えます。また、パラメータの名前をstr
にします。元のコードでは、このビットを間違えていました。 let
ため
toWordList :: String -> [String]
toWordList str =
[toLower x | x <- str]
let var = removePunctuation(x)
words var
構文はlet __ = __ in __
です。 do
を使用するときには別の表記法がありますが、今のところそれを忘れてしまいます。リストの理解の結果に名前を付けていないので、それをやりましょう:
toWordList str =
let lowered = [toLower x | x <- str] in
let var = removePunctuation lowered in
words var
これは機能します。私たちは文法を正しく取得し、モナディックな構文的砂糖(do
/return
)を避ける必要がありました。
でも、それはよりうれしいです。それらのlet
ブロックはちょっと醜いです、私たちはそれらを取り除くことができます。我々はまた、もう少しエレガントであり、あなたの理解に相当しmap toLower
とリスト内包、置き換えることができます。
toWordList str = words (removePunctuation (map toLower str))
ニース、それが今、単一の行までです!しかし、それらのすべての括弧も少し目障りです。私たちはどうすればthe $
functionを使用しますか?
toWordList str = words $ removePunctuation $ map toLower str
良い。これを別の改善があります。これはpoint-free styleに変換されます。ここではパラメータを明示的に指定しません。代わりにこの関数を他の関数の構成として表現します。
toWordList = words . removePunctuation . (map toLower)
そして、我々は完了です。うまくいけば、最初の2つのコードスニペットは、Haskellの構文がどのように動作するかを明確にし、最後のほんのいくつかは、かなり冗長なコードをどのようにしてもっときれいにすることができるかの良い例を示すかもしれません。