使用GHCi时如何为函数提供显式类型声明?

时间:2010-06-22 12:38:08

标签: haskell types ghci function-declaration

如何在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

3 个答案:

答案 0 :(得分:92)

  

有没有办法在GHCi中提供类型声明?

let numUniques' :: (Eq a) => [a] -> Int; numUniques' = length . nub
  

还是有另一种方法来定义这些不需要类型声明的函数吗?

如果使用-XNoMonomorphismRestriction关闭单态限制,则会推断出正确的类型。

答案 1 :(得分:13)

请注意,您也可以通过将“points”(即显式变量)添加回表达式来避免单态限制。所以这也给出了正确的类型:

  

让numUniques x =长度。 nub $ x

答案 2 :(得分:3)

《 GHC用户指南》显示了实现此目的的两种其他方法。 This subsection引入了:{ ... :}构造,可以如下使用:

> :{
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
| :}

或者,您可以启用multiline mode

> :set +m
> let
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
|