5

Haskellの特殊文字で構成されるHaskellの多くの関数は、中置関数です。これらには、、、、などが*含まれます。このような関数の型署名を取得するには、次のように関数を括弧で囲んで実行します。+==/:t

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

範囲関数の型アノテーションを取得してみたかったのです[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 `..'

範囲関数の型シグネチャを取得する方法を知っている人はいますか?

4

2 に答える 2

13

これ..は関数ではなく、実際にはシンタックスシュガーです。、、、またはのいくつかの関数のいずれかに変換されenumFromます。enumFromThenenumFromToenumFromThenTo

さまざまな方法で機能する4つの形式があるため、通常の機能にはなりません。つまり、これら4つすべてが有効です。

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

これらのフォームは、それぞれ前述の4つの関数を使用します。

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

これらの関数はすべてEnumクラスの一部であるため、..表記はその一部であるすべてのタイプで機能します。たとえば[False ..]、リストを作成して取得できます[False, True]。(残念ながら、現在の構文解析のあいまいさのため、モジュールである[False..]と想定しているため、書き込むことができません。)False

于 2013-02-01T06:33:22.397 に答える
8

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

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

表記は単なる構文糖衣であるためenumFromenumFromTo実際には従来のタイプではありません。

于 2013-02-01T06:32:29.997 に答える