85

この関数 ( 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
4

3 に答える 3

103

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

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

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

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

于 2010-06-22T12:43:00.893 に答える
13

また、式に「ポイント」(つまり、明示的な変数) を追加するだけで、単相性の制限を回避できることに注意してください。したがって、これも正しいタイプを提供します。

numUniques x = length とします。こぶ $ x

于 2010-06-22T14:43:40.083 に答える