私は与えられた任務に苦労しています。私はここで別のガイドに基づいてこのコードを少し書きました:スコープ外:データコンストラクター
私が抱えている問題はここのパイプです:
| x == "+" = (Sum y y',xs'') where
この問題は、3本のパイプまたは「場所」に続くパイプに関連しているようです。最後の2本のパイプを交換した場合。パッティング
x == "+" = (Sum y y' (...))
前
x == "*" = (Prod y y' (...))
エラーがそのコードに移動します。これらの2つのコードセグメントのいずれかをコメントアウトすると、すべてが正常に機能しますが、与えられた割り当てには両方が必要です。
簡単な要約:
| x == "*" = (Prod y y',xs'') where
(y,xs') = ast xs
(y',xs'') = ast xs'
と
| x == "+" = (Sum y y',xs'') where
(y,xs') = ast xs
(y',xs'') = ast xs'
どちらも100%単独で動作しますが、それらを組み合わせると、プログラムがコンパイルされません。
完全なコード:
import Data.Char
data AST = Leaf Int
| Sum AST AST
| Min AST
| Prod AST AST
deriving Show
tokenize::String -> [String]
tokenize[] = []
tokenize('+':xs) = "+": tokenize xs
tokenize('-':xs) = "-": tokenize xs
tokenize('*':xs) = "*": tokenize xs
tokenize(x:xs) = if isDigit x then (takeWhile isDigit (x:xs)) : tokenize (dropWhile isDigit xs) else tokenize(xs)
ast :: [String] -> (AST,[String])
ast [] = error "Empty string"
ast (x:xs) | all isDigit x = (Leaf (read x),xs)
| x == "-" = let (y,xs') = ast xs in (Min y,xs')
| x == "*" = (Prod y y',xs'') where
(y,xs') = ast xs
(y',xs'') = ast xs'
| x == "+" = (Sum y y',xs'') where
(y,xs') = ast xs
(y',xs'') = ast xs'