String
とChar
をとり、charが文字列内で出現するインデックスを出力しようとしています。Haskellの入力文字列でcharの出現を見つけるには
stringCount str ch =
Input : "haskell is hard" `h`
Output:[0,11]
Input : "haskell is hard" `a`
Output:[1,12]
私はハスケルを理解するのに苦労しています。
String
とChar
をとり、charが文字列内で出現するインデックスを出力しようとしています。Haskellの入力文字列でcharの出現を見つけるには
stringCount str ch =
Input : "haskell is hard" `h`
Output:[0,11]
Input : "haskell is hard" `a`
Output:[1,12]
私はハスケルを理解するのに苦労しています。
これを行う方法はたくさんありますが、あなたがハスケルの初心者だと言っているので、リストの理解が分かりやすいかもしれません(私はこれが宿題であると仮定しているので、 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]
あなたはここで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]
を使用して独自のを書くことができます:
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と呼ばれるカウンターを使用して、それぞれの再帰呼び出しのためにそれを増分します。
おかげでたくさんのdreamcrash – Diana
どうもありがとうマイケル・コールズとどのように私はelemIndexでそれを行うことができますか? – Diana
申し訳ありませんが、 'elemIndex'ではなく' elemIndices'です(後者は最初のオカレンスのインデックスのみを提供します)。 'elemIndices 'a' 'haskellが難しい' 'はあなたに望ましい結果を与えるので、引数の順序を逆にするだけです。 –