gpt4 book ai didi

haskell - 在 ghci 中读取 vs map

转载 作者:行者123 更新时间:2023-12-02 07:35:12 27 4
gpt4 key购买 nike

我在 ghci 7.6.3 中尝试了以下内容

prelude>让m = map

以上作品。 GHCi 没有错误。

但后来我尝试了,

prelude> let r = read

上面的代码在 GHCi 中抛出了一个大错误。这是我得到的错误,

*Main> let r = read

<interactive>:122:9:
No instance for (Read a0) arising from a use of `read'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance Read IOMode -- Defined in `GHC.IO.IOMode'
instance Read BufferMode -- Defined in `GHC.IO.Handle.Types'
instance Read Newline -- Defined in `GHC.IO.Handle.Types'
...plus 30 others
In the expression: read
In an equation for `r': r = read

然后我尝试了,

prelude> let r = read::Read a => String -> a

认为类型签名可能会解决问题。但是话又说回来,我从 GHCi 那里得到了一个错误。具体报错如下,

*Main> let r = read :: Read a => String -> a

<interactive>:123:9:
No instance for (Read a0) arising from an expression type signature
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance Read IOMode -- Defined in `GHC.IO.IOMode'
instance Read BufferMode -- Defined in `GHC.IO.Handle.Types'
instance Read Newline -- Defined in `GHC.IO.Handle.Types'
...plus 30 others
In the expression: read :: Read a => String -> a
In an equation for `r': r = read :: Read a => String -> a
*Main>

谁能告诉我发生了什么事吗?

谢谢。

最佳答案

这是单态限制的一个例子。默认情况下,您不允许像这样绑定(bind)多态值,因为它看起来像 r 的值应该只计算一次,但实际上每次调用时都会重新计算它。

在这种情况下,read 是多态的,因为它有一个隐式参数用于为 Read 类型类传递字典,因此 r 需要每次都要重新计算。 map 是单态的,因为它没有任何类型类限制。

如果你把它写成

let r x = read x

这将被允许。

您还可以添加非多态类型签名:

let r = read :: String -> Int

这允许它为 Read 的单个实例计算一次 r

带有类型签名的普通声明也不受单态限制,所以你这样写也是允许的。

r :: Read a => String -> a
r = read

您也可以使用 -XNoMonomorphismRestriction 选项或在文件顶部添加 {-# LANGUAGE NoMonomorphismRestriction #-} 来简单地关闭单态限制。这样做通常被认为是安全的,尽管它可能会对性能产生负面影响。

关于haskell - 在 ghci 中读取 vs map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17275446/

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