gpt4 book ai didi

haskell:读取不解析没有显式类型的 float

转载 作者:行者123 更新时间:2023-12-04 23:19:31 24 4
gpt4 key购买 nike

考虑以下函数

add1 :: Num a => a -> a
add1 x = x + 1

以及以下应用
*Main> add1 2
3
*Main> add1 2.2
3.2
*Main> add1 (read "1")
2
add1 (read "1.5"::Float)
2.5
*Main> add1 (read "1.5")
*** Exception: Prelude.read: no parse

为什么最后一次调用 add1浮点数失败,而它适用于整数?为什么我必须在这种情况下指定类型?

最佳答案

GHCi 给它类型

> :t add1 (read "1.5")
add1 (read "1.5") :: (Read a, Num a) => a

所以,它仍然是多态的。然而,当在 GHCi 中评估时,它隐含地 print ed,所以 GHCi 必须为 a 选择一些具体类型. GHCi 使用 the defaulting rules ,并静态选择 a = Integer .请注意,此选择是静态完成的(在类型检查期间,粗略地),并且仅取决于类型(例如 String ),而不是实际值(例如 "1.5" )。 Integer都是 Read和一个 Num ,所以所有静态检查都通过。

更详细地说,GHCi 尝试类型 () , Integer , Double -- 按照这个顺序,除非有 default声明另有说法。

然后,在运行时代码的行为如下
> add1 (read "1.5") :: Integer
*** Exception: Prelude.read: no parse

因为无法解析字符串。相比之下,这样就好了:
> add1 (read "1.5") :: Float
2.5

关于haskell:读取不解析没有显式类型的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31647833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com