GHCiを使用するときに関数に明示的な型宣言を提供するにはどうすればよいですか?


82

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

回答:


101

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

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

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

で単相制限をオフに-XNoMonomorphismRestrictionすると、正しいタイプが推測されます。


3
私はまだ単相性を持っていませんが、一般的にこの答えは、セミコロンを使用してGHCiの定義をグループ化することを示しました-チュートリアルは.hsファイルのように書かれているため、GHCiで試してみるとさまざまな問題が発生します(関数にバインディングがないなど) 。)。
Tomasz Gandor 2014年

それは注目にそれの価値-XNoMonomorphismRestriction7.8.1以降GHCiのためにデフォルトで有効になっています:downloads.haskell.org/~ghc/latest/docs/html/users_guide/...
N. SHEAD

13

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

numUniques x = lengthとします。ナブ$ x


1
ありがとう-それは知ってうれしいです。
mattbh 2010年

これはeta-expansionとして知られています
Bladt 2015

3

GHCユーザーズガイドには、これを実現するための2つの追加方法が示されています。このサブセクションでは、次のように使用できる:{...:}構文を紹介します。

> :{
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
| :}

または、マルチラインモードを有効にすることもできます

> :set +m
> let
| numUniques :: (Eq a) => [a] -> Int
| numUniques = length . nub
| 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.