1. ホーム
  2. haskell

[解決済み] GHCiで関数の型宣言を明示的に行うには?

2023-06-01 18:33:40

質問

この関数に相当するものをどのように定義すればよいのでしょうか? 学習するアハスケール から取ったもの)を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

どのように解決するのですか?

<ブロッククオート

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

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

<ブロッククオート

あるいは、このような関数を定義するために、型宣言を必要としない別の方法があるのでしょうか?

で単相性制限をオフにすると -XNoMonomorphismRestriction を使えば、正しい型が推論されます。