func = elem [1..10]在GHCi中有效,但无法编译

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了func = elem [1..10]在GHCi中有效,但无法编译相关的知识,希望对你有一定的参考价值。

在运行该命令的GHCI中

func = elem [1..10]

效果很好,还给了我部分功能。我很好奇它为什么起作用?当我尝试编译此代码时,它给了我一个错误。例如,这不适用于其他功能。 Map在GHCi中以及编译时给我一个错误。

func = map [1..10]

好奇GHCi和功能元素有什么特别之处。

我知道我可以这样写:

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]的功能。即就像在elem的任何其他用法中一样,它告诉您某些列表是否包含元素。该元素本身本身就是列表的事实是无关紧要的。

另一方面,map [1..10]只是错误的,因为map的第一个参数必须为

function

。并且列表虽然可以是列表元素,但是绝对不能成为函数。

以上是关于func = elem [1..10]在GHCi中有效,但无法编译的主要内容,如果未能解决你的问题,请参考以下文章

在 shell 脚本中编写 ghci 会话

Yesod:在 ghci 中运行“runDB”函数时键入实例错误

如何获得光泽以不关闭 ghci?

Windows10下ghci无法使用的解决方案

ghci 仅显示类型类方法

在 GHCi 中,为啥函数箭头 `:kind (->)` 的种类包含问号 `(->) :: ?? ->? -> *`? [复制]