这个没问题,没问题
Prelude> read "8.2" + 3.4
11.6
但这个不行
Prelude> read "8.2"+"3.4"
<interactive>:69:11:
No instance for (Num [Char]) arising from a use of ‘+’
In the expression: read "8.2" + "3.4"
In an equation for ‘it’: it = read "8.2" + "3.4"
这两个都没有:
Prelude> read "8.2" + 34
*** Exception: Prelude.read: no parse
为什么呢?我试过了:
read "8.2"::Float + 3.4 ::Float
也不起作用。
“阅读”的输入要求是什么?第一个字符串,另一个是非字符串,以便进行数学运算?
答案 0 :(得分:5)
你的假设是读取在线路的其余部分工作是错误的!
read :: Read a => String -> a
它只需要应用它的字符串而不是它后面的所有字符串,请尝试
(read "3.5") + (read "3.5") :: Float
请注意括号,我也建议您查看Learn you a haskell for great good - 对haskell的详细介绍。
read "8.2"+"3.4"
不起作用,因为您尝试添加字符串("3.4"
),编译器告诉您+
期望左侧和右侧相等所以它查找String
(又名[Char]
)的加号实例,因为这是+
的右侧。
read "8.2" + 34
不起作用,因为对于未指定的Integer
类型(Num
),Haskell默认为34 :: Num a => a
,因此它会尝试解析"8.2"
作为整数并失败,因为整数中没有点。
最后一个几乎是正确的,你只需添加一些parens就可以了(见上文)
您的标题也包含错误的假设:
+
的参数必须具有相同的类型
(+) :: Num a => a -> a -> a
类型签名说:东西&#34;数字&#34; (如果您了解java,那就像接口一样)可以使用+
函数,第一个,第二个参数以及结果属于同一类型。
如果您想进行转换,则必须手动/明确地进行转换