5

undefinedHaskell の部分的なリストですか?

私はそれ[1,2:undefined]が部分的であることを知っていますが、undefined単独ではどうですか?

4

3 に答える 3

12

undefined評価しようとするとエラーになる関数です。(ただし、評価しようとしなくても問題はありません。) の型シグネチャを調べてみましょうundefined

ghci> :t undefined
undefined :: a

これaは型変数であり、型シグネチャで識別される制約がないため (型制約は::=>シンボルの間に表示されます)、任意のa型にすることができます。

あなたの例で本当に a が必要かどうかはわかりません:

[1,2,undefined]は整数のリストなので、undefinedこの式の の型も整数です。

(1:2:undefined)も整数のリストですが:、2 番目の引数としてリストを取るため、undefinedこの式の の型は整数のリストです。

[1,2:undefined]意味がないと思います。1は整数ですが、整数2:undefinedリストです。異なるタイプの要素を持つリストを持つことはできません。


編集:

undefined実際には部分的なリスト*ではなく、単なる単一の値です(リストを含む任意のタイプにすることができます)。たとえば、[1,2,undefined]3 つの要素を持つリストです。最初の要素は1、2 番目の要素は2、3 番目の要素は評価できませんが、整数です。

*ただし、undefined最後の要素としてのリストは、その要素を評価できない限り、ある種の「部分リスト」を表すために使用できます。(それが@Danielの意味だと思います)。ただし、その前後に要素がある場合は、それらを評価できます。例えば:

ghci> last [1,2,undefined,4]
4

編集#2:

別の例が役立つかもしれません。ここでは、4 つの要素を持つリストを作成しました。そのうちの 1 つ ( c) はundefinedです。ghci にクエリを実行して の型を調べるcと、それがリストではなく単一の整数であることがわかります。

ghci> let (a:b:c:d) = [1,2,undefined,4]
ghci> :type c
c :: Integer
于 2013-06-17T15:37:04.837 に答える
2

コメントが指摘しているように、あなたの質問はあまり明確ではありませんが、いくつかの仮定を立てましょう。1:2:undefined最初に、おそらく部分リストの例として書くつもりでした。

> let p1 = 1:2:undefined
> :t p1
p1 :: [Integer]

したがって、p1 には 2 つの要素があり、残りは未定義であるため、ある意味では部分的なリストになります。この定義に従って、この型チェックが行われます。

> let p2 = undefined :: [Int]
> :t p2
p2 :: [Int]

要素は 0 で、残りは未定義です。これを空の部分リストと呼ぶことができます。

それについて考える別の方法は、それはとp1同じ[1,2] ++ undefinedであるということp2です[] ++ undefined

于 2013-06-17T19:06:57.400 に答える