Haskell:“read”函数不处理不同类型的“+”?

时间:2016-02-06 02:07:19

标签: string haskell

这个没问题,没问题

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 

也不起作用。

“阅读”的输入要求是什么?第一个字符串,另一个是非字符串,以便进行数学运算?

1 个答案:

答案 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,那就像接口一样)可以使用+函数,第一个,第二个参数以及结果属于同一类型。

如果您想进行转换,则必须手动/明确地进行转换