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

vik*_*ata 0 string haskell

这个没问题,没问题

Prelude> read "8.2" + 3.4
11.6
Run Code Online (Sandbox Code Playgroud)

但这个不行

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"
Run Code Online (Sandbox Code Playgroud)

这个都不是:

Prelude> read "8.2" + 34 
*** Exception: Prelude.read: no parse
Run Code Online (Sandbox Code Playgroud)

为什么?我试过了:

read "8.2"::Float + 3.4 ::Float 
Run Code Online (Sandbox Code Playgroud)

也不起作用.

"阅读"的输入要求是什么?第一个字符串,另一个非字符串,为了做数学?

eps*_*lbe 5

你认为读取工作在其余部分是错误的!

read :: Read a => String -> a
Run Code Online (Sandbox Code Playgroud)

它只需要应用它的字符串而不是它后面的所有字符串,请尝试

(read "3.5") + (read "3.5") :: Float
Run Code Online (Sandbox Code Playgroud)

注意括号,我也建议看一下非常好的学习一个haskell - 对haskell的坚实介绍.

  • read "8.2"+"3.4"不起作用,因为你尝试添加一个字符串("3.4"),并且编译器告诉你+期望左侧和右侧相等,所以它寻找String(又名[Char])的加号实例,因为这是右侧的+.

  • read "8.2" + 34不起作用,因为Haskell默认Integer为未指定的Num类型(34 :: Num a => a),因此它尝试解析"8.2"为整数并失败,因为整数中没有点.

  • 最后一个几乎是正确的,你只需添加parens使其工作(见上文)

你的标题还包括一个错误的假设:

+必须具有相同类型的参数

(+) :: Num a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

类型签名说:"Numeric"(如果你知道java就是一个接口)可以使用该+函数,第一个,第二个参数以及结果属于同一类型.

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