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