私はhaskellを学んでいて、その言語を扱うためにさまざまな関数を書いています。私はこの関数を書いた:関数宣言のリストパターンの構文
doubleOneOrTail :: [t]->[t]
doubleOneOrTail [x] = [x,x]
doubleOneOrTail (x:xs) = xs
これはまさに言うことです。 1要素のリストを2倍にするか、複数の要素のリストの末尾を返します。これなど、単一の要素またはリストのリストのリストのために働く一般的な構文は、私は次のようにこの関数を書き換えることができます。
doubleOneOrTail :: [[t]]->[[t]]
doubleOneOrTail [[x]] = [[x,x]]
doubleOneOrTail (x:xs) = xs
私は次のように入力している場合、このエラーがスローされます。
doubleOneOrTail [1,2,3]
が、それはこれを受け入れない:
doubleOneOrTail [[[[1,2,3]、[2]]]]とのリストとして
トリートそれをシングル(その要素はリストのリストです)、それを倍にします。
パターン[a] - > [a]は単一の要素のリストと一致しませんが、何らかの方法でリストの順序に一致していることは明らかです。 Whlie [[a]] - > [[a]]はリストの複数のオーダーにマッチしています(単一のエレメントのリストではありません)。誰かがこれがどのように働いているのか説明できるなら、それは大いに感謝されるでしょう。
二次的な質問は、具体的にはリストの特定の順序を取る関数宣言を持つことが可能です(または望ましい場合もあります)。リストのリストだけを言う?
感謝を文字、数字、ブール値のリストを受け付けます。だから私が[[a]] - [[a]]をやっているとき、私は[[[]]]]に渡されたときにどのようなタイプaであるべきかを理解するために2つのレベルの指標を削除していました。 (これは、奇妙で直観的な結果につながる可能性があります) –