2016-11-05 2 views
-5

StringCharをとり、charが文字列内で出現するインデックスを出力しようとしています。Haskellの入力文字列でcharの出現を見つけるには

stringCount str ch = 
Input : "haskell is hard" `h` 
Output:[0,11] 
Input : "haskell is hard" `a` 
Output:[1,12] 

私はハスケルを理解するのに苦労しています。

答えて

1

これを行う方法はたくさんありますが、あなたがハスケルの初心者だと言っているので、リストの理解が分かりやすいかもしれません(私はこれが宿題であると仮定しているので、 elemIndices):

stringCount str ch = [ y | (x, y) <- zip str [0..], x == ch ] 
stringCount "haskell is hard" 'a' 
-- [1,12] 
stringCount "haskell is hard" 'h' 
-- [0,11] 

ここzipなどタプル('h', 0), ('a', 1), ('s', 2)を生成0から始まる無限のリストの文字列str、私たちはその後、唯一xにバインドされた文字は、()の引数に等しいタプルを選択chそれぞれのインデックス(yにバインドされています)を返します。

あなたの現在の引数の順序を保持していますが、以下を使用することができますelementIndices使用したい場合:

stringCount' = flip elemIndices 
stringCount' "haskell is hard" 'h' 
-- [0,11] 
+0

どうもありがとうマイケル・コールズとどのように私はelemIndexでそれを行うことができますか? – Diana

+0

申し訳ありませんが、 'elemIndex'ではなく' elemIndices'です(後者は最初のオカレンスのインデックスのみを提供します)。 'elemIndices 'a' 'haskellが難しい' 'はあなたに望ましい結果を与えるので、引数の順序を逆にするだけです。 –

0

あなたはここでkarakfaずつポスト単純あまり洗練されたソリューションであるリストを歩いてelemIndexを使用するか、または単に

indexOf x = map fst . filter (\(_,s) -> s==x) . zip [0..] 

indexOf 'a' "haskell is hard" 
[1,12] 

またはfindIndices

import Data.List(findIndices) 
findIndices (\x -> x=='a') "haskell is hard" 
[1,12] 
0

を使用して独自のを書くことができます:

stringCount :: String -> Char -> Integer -> [Integer] 
stringCount [] c _ = [] 
stringCount (x:xs) c pos | x == c = pos:(stringCount xs c (pos+1)) 
         | otherwise = stringCount xs c (pos+1) 

アイデアはあなたが行くことです再帰を使用してcharによって文字列charを処理し、実際のcaracter(現時点では頭)と引数として渡されたcharとを比較します。位置を追跡するために、私はposと呼ばれるカウンターを使用して、それぞれの再帰呼び出しのためにそれを増分します。

+0

おかげでたくさんのdreamcrash – Diana

関連する問題