ハスケルのデータ型は、リストを単独リンクのコンスリストとして表しています。パターン一致は、表記だけでなく、頭やその他の部分の短所としてメモリに格納される方法です。
、あなたの更新で述べたように、あなたがリストを経て、初期化部分と最後の要素に分割し関数を記述することができます
unsnoc :: [a] -> Maybe ([a], a)
あなたはパターンでそれを使用するview patternを使用することができますマッチング:
f (unsnoc -> Just (xs, x)) = ...
f [] = ...
そして、あなたはpattern synonymにそれをラップでもすることができます
pattern xs :> x <- (unsnoc -> Just (xs, x))
あなたはしかし、彼らはすべてなので、すべてのこれらのアプローチはまだ、リスト全体の背骨を横断する必要があること
f (xs :> x) = ...
f [] = ...
ノートを書くことができるように
(または双方向バージョン
pattern xs :> x <- (unsnoc -> Just (xs, x)) where
xs :> x = xs ++ [x]
)
最終的にはあなたのunsnoc
関数を呼び出すだけです。あなたが最後の要素(又は他の任意の要素)のパターン一致させることができることはできないが、固定サイズのリストの任意のリストについて
これらパターン同義語の存在、および効率性に悲惨な影響を与える可能性があるため、効率的な実装を示すために純粋に存在する型クラスによって制御されるべきではないかと疑いを感じます。 'Unsnoc'はあなたに' unsnoc :: c - > a'を与え、 'EfficientUnsnoc'は':> 'とマッチさせるために必要なコンテキストですが、' Unsnoc a c => EfficientUnsnoc a c'のように。 – dfeuer