我正在嘗試編寫一個函數,該函數將採用String
和Char
並輸出char在字符串中出現的位置。如何在Haskell中的輸入字符串中查找字符的出現
stringCount str ch =
Input : "haskell is hard" `h`
Output:[0,11]
Input : "haskell is hard" `a`
Output:[1,12]
請幫助我我努力理解哈斯克爾。
我正在嘗試編寫一個函數,該函數將採用String
和Char
並輸出char在字符串中出現的位置。如何在Haskell中的輸入字符串中查找字符的出現
stringCount str ch =
Input : "haskell is hard" `h`
Output:[0,11]
Input : "haskell is hard" `a`
Output:[1,12]
請幫助我我努力理解哈斯克爾。
有很多方法可以做到這一點,但由於您提到您是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]
可以使用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]
下面是一個簡單,但不太複雜的解決方案,在一個崗位由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的計數器,併爲每次遞歸調用增加它。
非常感謝dreamcrash – Diana
非常感謝邁克爾·科爾和如何與elemIndex辦呢? – Diana
對不起,它是'elemIndices',而不是'elemIndex'(後者只給你第一次出現的索引)。 'elemIndices'''haskell很難''給你想要的結果,所以你只需要翻轉參數順序。 –