85

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

3 回答 3

103

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

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

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

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

于 2010-06-22T12:43:00.893 回答
13

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

让 numUniques x = 长度。小块$ x

于 2010-06-22T14:43:40.083 回答
8

GHC 用户指南显示了实现此目的的另外两种方法。本小节介绍:{...:}构造,可按如下方式使用:

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

或者,您可以启用多行模式

> :set +m
> let
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
| 
于 2020-03-12T04:07:49.003 回答