ここでHaskell初心者は、数式を解析するコードを書こうとしています。 コード:ハスケルのガードを入れ子にすることは可能ですか?
isDigit :: Char -> Bool
isDigit c = c >= '0' && c <= '9'
parseNumber :: String -> Maybe (String, String)
parseNumber [] = Just ("", "")
parseNumber (h:ls)
| isDigit h
| p == Nothing = Just([h], ls) -- Digit found <<< ERROR!!
| otherwise = Just (h:fst d, snd d) -- Ends in a digit
| h == '.'
| p == Nothing = Nothing -- Ends in a point
| not ('.' `elem` (snd d)) = Just (h:(fst d), snd d) -- We don't want multiple dots
| otherwise = Nothing -- Not a number, stop looking!
where
p = parseNumber ls
Just d = parseNumber ls -- Float version of p. Not used if p is Nothing
この関数は、数字で始まり、式の残りの部分から分離数を返す文字列を取ることになっています。例:
parseNumber "123.0 + 2"
( "123.0"、 "+ 2")
私は、このネストされた警備員構文は本当にうまく読み込みと思いますが、そうでありません作業。 マークされた行のエラーが読み込まれます。
入力時に解析エラーが発生しました。
ハスケルではチェーンガードは許可されていませんか?それとも何とかこれを間違って書いていますか?また、どのような選択肢を単純な方法でロジックをチェーン化する必要がありますか?
ありがとう、それは完璧に動作します。私はちょっと読むのが少し難しいと思っています。 – SlySherZ