在解释器中工作时,将函数绑定到名称通常很方便,例如:
ghci> let f = (+1)
ghci> f 1
2
将名称f
别名为函数(+1)
。简单。
但是,这并不总是有效。我发现导致错误的一个示例是尝试从nub
模块中对Data.List
进行别名。例如,
ghci> :m Data.List
ghci> nub [1,2,2,3,3,3]
[1,2,3]
ghci> let f = nub
ghci> f [1,2,2,3,3,3]
<interactive>:1:14:
No instance for (Num ())
arising from the literal `3'
Possible fix: add an instance declaration for (Num ())
In the expression: 3
In the first argument of `f', namely `[1, 2, 2, 3, ....]'
In the expression: f [1, 2, 2, 3, ....]
但是,如果我明确说明参数x
,那么它可以正常工作:
ghci> let f x = nub x
ghci> f [1,2,2,3,3,3]
[1,2,3]
任何人都可以解释这种行为吗?
答案 0 :(得分:3)
当前Ghci版本中的类型默认规则有点难以理解。
您可以为f
提供类型签名。或者像先前Chris建议的那样,将:set -XNoMonomorphismRestriction
添加到您的~/.ghci
文件中。