私はHaskellで自分自身にスキームを書くことを経験しています。それは素晴らしいチュートリアルですが、構文解析の演習の1つで壁にぶつかりました:
parseNumber :: Parser LispVal
parseNumber = liftM (Number . read) $ many1 digit
以下を使用してparseNumberを書き換えます。
- 表記する
- >>=演算子を使用した明示的なシーケンス
do-notationに問題はありませんでした:
parseNumber :: Parser LispVal
parseNumber = do x <- many1 digit
let y = read x
return $ Number y
#2については、次のようなバリエーションを試しました。
parseNumber :: Parser LispVal
parseNumber = (many1 digit) >>= (liftM (Number . read))
しかし、私はタイプエラーに遭遇し続けます。2つの質問があります。
- なぜタイプエラーが発生するのですか?モナディックバインド演算子を誤解していますか?
- do-notationソリューションで同様のタイプエラーが発生しないのはなぜですか?
タイプに関する基本的な概念が欠けているような気がしますか?