在这段代码中,没有办法做多态:
data NumericExpr e = Var e | Const e | Times [e] | Div e e deriving (Show,Read)
readCommand:: a -> b
readCommand entrada = Var 3
它给了我一个很大的错误,我无法复制:
无法将预期类型b与实际类型匹配NumericExpr e0 b是a 由readcommand :: a的类型签名绑定的刚性类型变量 - > B'/ P>
编辑:
尚未使用:
data NumericExpr e = Var e | Const e | Plus [e] | Minus [e] | Times [e] | Div e e deriving (Show,Read)
data Expr e = Num e | String e
readCommand:: Expr b => a -> b
readCommand entrada = Var 3
答案 0 :(得分:2)
您说readCommand
可以生成用户请求的任何类型b
的结果,但您生成结果Var 3
,这是NumericExpr e
(对于e
一些数字类型NumericExpr e
)。所以实际上你只能生成readCommand :: Num b => a -> NumericExpr b
类型的结果,而不是任何类型的结果。所以你的类型签名不正确。如果您想确定readCommand :: a -> NumericExpr Integer
的特定类型,则必须为3
或a -> b
。
请注意,b
类型的函数(var x=this.getField ("TextField1");
var y=this.getField ("NumberField1");
var z=this.getField ("NumberField2");
if (x.value == "A") {z.value=(50+y.value);}
else if ((x.value == "B") || (x.value == "C")) {z.value=(100+y.value);}
else if (x.value == "D") {z.value=(200+y.value);}
else {z.value="Type an appropriate letter on TextField1"}
没有任何约束)可能会产生结果。这是该类型的任何可能的功能将永远循环或崩溃。