Haskell - 无法将预期类型与实际类型匹配

时间:2016-03-30 19:06:51

标签: haskell compilation

在这段代码中,没有办法做多态:

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

1 个答案:

答案 0 :(得分:2)

您说readCommand可以生成用户请求的任何类型b的结果,但您生成结果Var 3,这是NumericExpr e(对于e一些数字类型NumericExpr e)。所以实际上你只能生成readCommand :: Num b => a -> NumericExpr b类型的结果,而不是任何类型的结果。所以你的类型签名不正确。如果您想确定readCommand :: a -> NumericExpr Integer的特定类型,则必须为3a -> 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"} 没有任何约束)可能会产生结果。这是该类型的任何可能的功能将永远循环或崩溃。