web-dev-qa-db-ja.com

GHCiを使用するときに関数の明示的な型宣言を提供する方法は?

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
77
mattbh

GHCiで型宣言を提供する方法はありますか?

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

または、型宣言を必要としないこれらのような関数を定義する別の方法はありますか?

-XNoMonomorphismRestrictionを使用してモノモーフィズム制限をオフにすると、正しい型が推測されます。

92
sepp2k

式に「ポイント」(つまり、明示的な変数)を追加するだけで、単形性の制限を回避することもできます。だからこれも正しいタイプを与えます:

numUniques x = lengthとします。 nub $ x

13
sclv