2016-11-05 64 views

回答

1

有很多方法可以做到這一點,但由於您提到您是Haskell初學者,因此列表理解可能最容易理解(我假設這是家庭作業,所以您必須自己實現,而不是使用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,串str從0開始的無限列表中,產生的元組('h', 0), ('a', 1), ('s', 2)等,我們則只能選擇其中的字符(綁定到x)等於參數中的元組ch並返回每個人的索引(綁定到y)。

如果你想保持你的當前參數順序,但使用elementIndices您可以使用以下方法:

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

非常感謝邁克爾·科爾和如何與elemIndex辦呢? – Diana

+0

對不起,它是'elemIndices',而不是'elemIndex'(後者只給你第一次出現的索引)。 'elemIndices'''haskell很難''給你想要的結果,所以你只需要翻轉參數順序。 –

0

可以使用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

下面是一個簡單,但不太複雜的解決方案,在一個崗位由karakfa :

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使用遞歸,然後將實際的caracter(此刻頭)與作爲參數傳遞的char進行比較。爲了跟蹤位置,我使用了一個名爲pos的計數器,併爲每次遞歸調用增加它。

+0

非常感謝dreamcrash – Diana

相關問題