gpt4 book ai didi

haskell - func = elem [1..10] 在 GHCi 中工作但不能编译

转载 作者:行者123 更新时间:2023-12-04 01:31:49 27 4
gpt4 key购买 nike

在 GHCi 中运行此命令
func = elem [1..10]
工作得很好,并为我提供了部分功能。我很好奇它为什么有效?当我尝试编译此代码时,它给了我一个错误。例如,这不适用于其他功能。 Map 在 GHCi 和编译时给我一个错误。
func = map [1..10]
好奇 GHCi 和函数 elem 有什么特别之处。

我知道我可以把它写成:
func = (`elem` [1..10])func = (`map` [1..10])
它有效,但为什么另一种方式对 elem 有效。

最佳答案

elem [1..10]是一个完全合理的术语。例子:

Prelude> elem [1..10] [[0..9], [1..10]]
True
Prelude> elem [1..10] [[0..8], [1..7]]
False

也许更常见的是,这会写成
Prelude> [1..10] `elem` [[0..9], [1..10]]
True
Prelude> [1..10] `elem` [[0..8], [1..7]]
False

但这只是同一事物的不同句法版本。

这意味着它也可以被编译,你只需要给它一个适当的签名(或者让 GHC 为你推断一个)。例如,
f :: [[Int]] -> Bool
f = elem [1..10]

...该函数告诉您数字列表列表是否包含列表 [1..10] . IE。就像 elem 的任何其他用途一样,它会告诉您某个列表是否包含某个元素。这个元素本身就是一个列表这一事实是无关紧要的。

另一方面 map [1..10]是错误的,因为 map 的第一个参数必须是一个函数。列表虽然可以是列表元素,但永远不能是函数†。

运算符部分的情况完全不同 (`elem`[1..10])(`map`[1..10]) .在这些示例中, [1..10]实际上是第二个参数。该部分省略了左/第一个参数。所以在这种情况下,我们谈论的是
Prelude> 3 `elem` [1..10]
True
Prelude> 19 `elem` [1..10]
False

...这也适用于
Prelude> negate `map` [1..10]
[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]

虽然这会更常见地写成 map negate [1..10]negate<$>[1..10] .

†从某种意义上说,同时也是学究式和无政府主义,列表实际上可以是函数:使用 -XOverloadedLists 扩展,您可以编写一个类实例,允许您使用列表语法定义函数。我不明白这怎么可能有任何意义,但也许了解这种理论上的可能性是件好事。特别是,启用该扩展后, map [1..10]令人困惑地编译,你只会得到一个令人困惑的错误,涉及 Could not deduce ... The type variable ‘a0’ is ambiguous在别处胡言乱语。

关于haskell - func = elem [1..10] 在 GHCi 中工作但不能编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60860964/

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