2016-04-04 28 views
-2

のリストの最初の出現のインデックスを取得します:Haskellは - 私は、次のような文字列のリストを持っている文字列

[ "aaa", "aaa", "aba", "aaa"] 

私はどこそこのリストの最初の位置を返す関数を作りたいです文字 'b'を含む項目です。ハスケルでどうすればいいですか?

+4

'b'を含むリストの最初の要素を見つけることができますか?文字が文字列に現れるかどうかを調べる関数を書くことができますか?たとえば、 'contains" aba "'b''は' True'を返します。 – bheklilr

+0

@bheklilr私が見る限り、この関数は推奨されていません。代わりにisInfixOfを使うことができます。この場合は 'isInfixOf" b "" aba "'は 'True'を返すでしょう – molinet

+0

私は実際に' contains'関数があることに気付かず、これは代入であると仮定し、リンクされたリストの再帰で作業することについて教えてくれるはずです。その場合はできるだけ多くのことを学ぶことができます。 – bheklilr

答えて

2

は、あなたがやりたいだろう関数です。

getIndexWithb = findIndex ('b' `elem`) 

あなたはこの仕事をするためにData.Listをインポートする必要があります。また、'b'がいずれの文字列にも現れない場合、この関数はタイプMaybe Intを返します。


使用:

> getIndexWithb [ "aaa", "aaa", "aba", "aaa"] 
Just 2 
1

最初のポジションを尋ねるので、インデックス値または実際の値を使用するかどうかはわかりません。ここでは、そのインデックスにインデックスと値の両方を含むタプルを与える関数があります。

import Data.Maybe 

firstOccurrenceOf :: Char -> [String] -> Maybe (Int, String) 
firstOccurrenceOf c list = 
    listToMaybe $ filter (elem c . snd) $ zip [0..] list 

listToMaybe空のリストにクラッシュするのではなく、Nothingを返しますheadへの安全な代替手段を提供します。ここで

+1

'safeHead'の代わりに' listToMaybe'を使うことができます。 – is7s

+0

いいですか? 'elem c'は入力として' Char'を取るかのように見えます... – chi

+0

@chi - 'elem c'は' String - > Bool'型です。 'elem'は通常、' Char'を受け入れるべきだと思っているインフィックス形式で使われているからです。 –

2

The List Utilities chapter of the Haskell Report任意の述語を満たすリストの最初の要素のインデックスを見つける機能findIndexを記述する。それはそれと

findIndex p xs = 
    case [ i | (x, i) <- zip xs [0..], p x ] of 
    [] -> Nothing 
    e:_ -> Just e 

として実装することができ、あなたはこれまでのところ、あなたのアプローチはどのようなものであった

findIndex ('b'`elem`) ["aaa", "aaa", "aba", "aaa"]