2016-03-30 3 views
1

パラメータのリストと頭と尾のパターンのパターンが別々にあるので、x:xsを使用するとします。これは、入力が値xとリストxsに分割されていることを意味します。コロン記法を使用してリストの最後の値を取得するにはどうすればよいですか?

コロンは以前のものと同じ値として扱われ、コロン記号で最後のものはリストの残りの部分になり、単一の値xが削除されます。

しかし、残りの値と最後の値を分けたければどうなりますか?この表記法は使えないようです。

更新:私は再帰を使用して最後の番号を見つける方法を知っていると思いますが、単純にパターンマッチングの何らかの方法でそれを得ることはできません。

答えて

2

ハスケルのデータ型は、リストを単独リンクのコンスリストとして表しています。パターン一致は、表記だけでなく、頭やその他の部分の短所としてメモリに格納される方法です。

、あなたの更新で述べたように、あなたがリストを経て、初期化部分と最後の要素に分割し関数を記述することができます

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関数を呼び出すだけです。あなたが最後の要素(又は他の任意の要素)のパターン一致させることができることはできないが、固定サイズのリストの任意のリストについて

+1

これらパターン同義語の存在、および効率性に悲惨な影響を与える可能性があるため、効率的な実装を示すために純粋に存在する型クラスによって制御されるべきではないかと疑いを感じます。 'Unsnoc'はあなたに' unsnoc :: c - > a'を与え、 'EfficientUnsnoc'は':> 'とマッチさせるために必要なコンテキストですが、' Unsnoc a c => EfficientUnsnoc a c'のように。 – dfeuer

0

、例えば

lastof4 [_,_,_,x] = x 

lastof4 [1..4] 
4 
関連する問題