undefined
Haskell の部分的なリストですか?
私はそれ[1,2:undefined]
が部分的であることを知っていますが、undefined
単独ではどうですか?
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
コメントが指摘しているように、あなたの質問はあまり明確ではありませんが、いくつかの仮定を立てましょう。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
。