このデータ構造のカスタム読み取り関数を実装するために、今から数時間試しました。
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^5
Monom(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)
、適切な方法で修正する方法がわかりません。
ご協力いただきありがとうございます!