2013-02-01 9 views
5

ハスケルの特殊文字で構成されたハスケルの多くの関数は、インフィクス関数です。私がしようとするの型シグネチャを取得したいHaskellでrange関数の型シグネチャを取得するにはどうすればよいですか?

GHCi> :t (==) 
(==) :: Eq a => a -> a -> Bool 

:これらは、括弧内の関数を置くような関数の型シグネチャを取得し、:tを実行し、そのようにするなど*+==/を含み、範囲関数[a..a]がありますが、この関数はインフィックスであると思われますが、リスト内でのみ使用できます[]。私は、以下のすべてを試したが、どれも働いた:

GHCi> :t (..) 
<interactive>:1:2: parse error on input `..' 
GHCi> :t ([..]) 
<interactive>:1:3: parse error on input `..' 
GHCi> :t [..] 
<interactive>:1:2: parse error on input `..' 
GHCi> :t .. 
<interactive>:1:1: parse error on input `..' 

誰もがレンジ機能の型シグネチャを取得する方法を知っていますか?

答えて

13

..は機能ではなく、実際にはシンタックスシュガーです。それはいくつかの機能の一つに翻訳されます:enumFromenumFromThenenumFromToまたはenumFromThenTo

異なる方法で動作する4つのフォームがあるため、通常の関数にすることはできません。つまり、これらの4つのすべてが有効です:

[1..]  -- enumFrom 1 
[1,2..] -- enumFromThen 1 2 
[1..10] -- enumFromTo 1 10 
[1,2..10] -- enumFromThenTo 1 2 10 

これらのフォームは、私がそれぞれ述べた4つの機能を使用しています。

通常の演算子の場合は、1..は部分的に適用される関数です。代わりに、リストを生成します。さらに、通常の関数の場合、[1,2..10]表記は[1,(2..10)]として解析されます。実際には、すべてが3つの数値をすべて引数とする単一の関数に変換されます。

これらの関数はすべてEnumクラスの一部です。そのため、..という表記法は、その一部の型で使用できます。たとえば、[False ..]と書いてリスト[False, True]を得ることができます。 (残念ながら、現在の解析のあいまいさのために[False..]と書くことはできません。Falseがモジュールであると仮定しているためです)

8

ラムダを使用してください。

> :t \x y -> [x..y] 

表記はそれが本当に従来のタイプを持っていないenumFromenumFromToのためだけの構文糖です。

関連する問題