2016-04-14 16 views
1

リスト(たとえば、[1,2,3,1,5])をとり、特定の要素の直後にある要素のリストを返す非常に単純な関数を書こうとしています。私がこれまでに達している何高次関数とラムダ計算を使ってHaskellでリストを操作する

は次のとおりです。

function element list = filter (\x -> element:x) list 

マイ所望の出力:

機能1 [1,2,3,1,5]

=>   [ 2,5]

+0

に動作します、正しい? – jamshidh

+0

;指定された要素direcltyは、所望の要素の前にある。 –

+0

w/list comprehensionsこれは 'foo a xs = [y | (x:y:_)< - tails xs、x == a 'である。 ['tails'はData.Listのものです](https://hackage.haskell.org/package/base-4.8.2.0/docs/Data-List.html#v:tails)。 –

答えて

5

お試しください

map snd $ filter ((== x) . fst) $ zip theList (tail theList) 

これは空のリストでは機能しませんが、これに対処するにはさらにコードが必要です。


これはどのように機能しますか?

まず、値が右から左に流れることに注意してください。 ($)オペレータはこれを可能にします。したがって、評価される最初の部分はzip関数です。上記のご例えば

zip theList (tail theList) 

、これは、リスト内の同時ペアのセットです

[(1,2), (2, 3), (3, 1), (1,5)] 

に等しい

zip [1,2,3,1,5] [2,3,1,5] 

をもたらすであろう。

次に、フィルタは英語で

filter ((== x) . fst) $ .... 

に適用され、これが何を言うことは最初の要素がxに等しいだけの同時ペアをフィルタ、です。出力は

[(1,2), (1,5)] 

今、私たちは始まる同時ペアのリストを持っています。

は最後に、我々は適用マップ

map snd $ .... 

これはちょうどペアの第2の値を引き出します。

map snd [(1,2), (1,5)] = [2,5] 

これは望ましい値です。


注:上記の空のリストには不満があります。

これは、空のリストにtailクラッシュ

tail [] --error 

あり、この動作(例えば、safeパッケージを参照)パッチを適用する方法がありますが、それは主にこの点では簿記ですので、私はそれを左にあなたがうまくいくために。


私たちが使用した関数はすべて怠け者であるため、この方法は無限長のリストにも有効です。

あなたは、単純なリスト内包して非常に簡単にこれを行うことができます
+0

'tail 'を' drop 1'に置き換えれば、空リストに対しても機能します。 –

0

、例えば:

successors xs i = [y | (x,y) <- zip xs (drop 1 xs), x == i] 
0

これは「後」、私はあなたが意味すると仮定し、「隣」とは、あなたの仕様

next x (i:y:ys) -- look at the first two items in the list 
    | x == i = -- if the first item == x, 
     y : next x (y:ys) -- take the second, and continue minus the first element 
    |otherwise = -- not equal, 
     next x (y:ys) -- so skip that element 
next _ [_] = [] -- if there's no second element, then stop 
next _ _ = [] -- if the list is empty, stop 
関連する問題