2010-06-22 15 views
58

如何在GHCi中定義此功能的等價物(取自learnyouahaskell)?如何在使用GHCi時爲函數提供顯式類型聲明?

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 

回答

79

有沒有辦法在GHCI提供類型聲明?

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

或者有另一種方式來定義這樣的功能,它不需要類型聲明?

如果您關閉-XNoMonomorphismRestriction的單態限制,它會推斷出正確的類型。

+0

完美 - 謝謝! – mattbh 2010-06-22 13:55:33

+2

我還沒有與單形態,但通常這個答案指出我用分號將GHCI中的定義分組在一起 - 教程是寫在一個.hs文件,這在GHCi中嘗試時會給出許多不同的問題(函數缺乏綁定等等。)。 – 2014-10-27 14:14:50

13

請注意,您還可以通過將「點」(即顯式變量)添加回表達式來避免單態的限制。所以這也給出了正確的類型:

讓numUniques x =長度。小塊$ X

+1

謝謝 - 這很瞭解。 – mattbh 2010-06-23 09:57:53

+0

這被稱爲eta-expansion – Bladt 2015-02-14 21:22:23