-1

このデータ構造のカスタム読み取り関数を実装するために、今から数時間試しました。

data Term = Monom(Float, Integer)
        | Addition(Term, Term) 
        | Subtraktion(Term, Term)
        | Multiplikation(Term, Term) 
        | Division(Term, Term) 

read 関数の背後にある考え方は、 のような中置用語を解析することです(+ (+ Monom Monom) Monom)。今のところ、 に変換されるような式ではなく、2に変換されるような数値である Monoms を試しました。Monom(2,0)2x^5Monom(2,5)

instance Read Term where 
    readsPrec _ inp = let [(a,b)] = lex inp in
        case a of
        -- these are control characters for making the input look nicer
        "(" -> readsPrec 0 b
        ")" -> readsPrec 0 b
        " " -> readsPrec 0 b
        -- end character -> nothing to do here
        ""  -> []
        -- operators
        "+" -> let res = readsPrec 0 b in [Addition(res)]  
        "-" -> let res = readsPrec 0 b in [Subtraktion(res)]
        "*" -> let res = readsPrec 0 b in [Multiplikation(res)]
        "/" -> let res = readsPrec 0 b in [Division(res)]
        -- monom
        c -> let res  = readsPrec 0 b in [Monom(read c::Float,0),res]

悲しいことに、これは次のエラー (加算およびその他の演算子で発生する) のため、機能しません。

Couldn't match expected type `(Term, String)'
            with actual type `Term'
In the return type of a call of `Addition'
In the expression: Addition (res)
In the expression: [Addition (res)]

ソースを修正する方法を教えてください。予想されるタイプがなぜなのか(Term,String)、適切な方法で修正する方法がわかりません。

ご協力いただきありがとうございます!

4

1 に答える 1

1

readsPrecTerm返す必要があり[(Term, String)]ます。したがって、戻る場所では[Addition (res)]、が必要です[(Term, String)]が、実際には[Term]. 引数も間違っていることに注意してください:resは ですが、[(Term, String)]Addition(res)ある必要がある(Term, Term)ため、後で修正する必要があります。

于 2012-10-23T09:07:21.940 に答える