在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]
...它是告诉您数字列表中是否包含list的功能[1..10]
。也就是说,就像在的其他任何用法中一样elem
,它告诉您某些列表是否包含元素。该元素本身本身就是列表的事实是无关紧要的。
另一方面map [1..10]
,这是错误的,因为to的第一个参数map
必须是一个function。并且列表虽然可以是列表元素,但绝对不能成为功能†。
与运算符部分(`elem`[1..10])
和截然不同(`map`[1..10])
。在这些示例中,[1..10]
实际上是第二个参数。本节省略了left / first参数。所以在这种情况下,我们所说的就像
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句