如何在GHCi中定义此函数的等效项(取自learnyouahaskell?]
import Data.List
numUniques :: (Eq a) => [a] -> Int
numUniques = length . nub
没有类型声明,GHCi接受函数定义,但最终以无用的类型结尾:
Prelude Data.List> import Data.List
Prelude Data.List> let numUniques' = length . nub
Prelude Data.List> :t numUniques'
numUniques' :: [()] -> Int
结果函数仅接受单位列表作为参数。
是否可以在GHCi中提供类型声明?还是有另一种方法来定义这些不需要类型声明的函数?
我在GHCi指南中没有发现明显的线索,并尝试了如下所示的表达式(无济于事:]
> let numUniques' = ((length . nub) :: (Eq a) => [a] -> Int)
> :t numUniques'
numUniques' :: [()] -> Int
有没有办法在GHCi中提供类型声明?
let numUniques' :: (Eq a) => [a] -> Int; numUniques' = length . nub
或者还有另一种方法来定义不需要类型声明的此类函数吗?
如果用-XNoMonomorphismRestriction
关闭单态限制,则会推断出正确的类型。
注意,您还可以通过在表达式中添加“点”(即显式变量)来避免单态性限制。因此,这也给出了正确的类型:
让numUniques x = length。 nub $ x
《 GHC用户指南》显示了实现此目的的两种其他方法。 This subsection引入:{
... :}
构造,可以如下使用:
> :{
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
| :}
或者,您可以启用multiline mode:
> :set +m
> let
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
|