String 哈斯凯尔:“这是一个很好的例子。”;改为;函数不';“t手柄”+&引用;对于不同的类型?

String 哈斯凯尔:“这是一个很好的例子。”;改为;函数不';“t手柄”+&引用;对于不同的类型?,string,haskell,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" + 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"
为什么??我试过:

read "8.2"::Float + 3.4 ::Float 
也不行


“读取”的输入要求是什么?第一个字符串,另一个无字符串,为了做数学运算?

你认为read在这行的其余部分起作用的假设是错误的

read :: Read a => String -> a
它只接受应用到的字符串,而不是它后面的所有内容,请尝试

(read "3.5") + (read "3.5") :: Float
请注意括号,我还建议大家看一看——haskell的完整介绍

  • 读取“8.2”+“3.4”
    不起作用,因为您尝试添加字符串(
    “3.4”
    ),编译器告诉您
    +
    期望左侧和右侧相等,所以它为
    字符串(又称
    [Char]
    )寻找一个加号实例,因为
    +
    的右侧就是加号

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

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

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

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

(+) :: Num a => a -> a -> a
类型签名表示:“数字”(如果您了解java,它类似于一个接口)可以使用
+
函数,并且第一个、第二个参数以及结果的类型相同


如果你想进行转换,你必须手动/显式地进行转换。你认为read对行的其余部分有效的假设是错误的

read :: Read a => String -> a
它只接受应用到的字符串,而不是它后面的所有内容,请尝试

(read "3.5") + (read "3.5") :: Float
请注意括号,我还建议大家看一看——haskell的完整介绍

  • 读取“8.2”+“3.4”
    不起作用,因为您尝试添加字符串(
    “3.4”
    ),编译器告诉您
    +
    期望左侧和右侧相等,所以它为
    字符串(又称
    [Char]
    )寻找一个加号实例,因为
    +
    的右侧就是加号

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

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

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

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

(+) :: Num a => a -> a -> a
类型签名表示:“数字”(如果您了解java,它类似于一个接口)可以使用
+
函数,并且第一个、第二个参数以及结果的类型相同

如果要进行转换,必须手动/显式进行转换