2016-04-04 28 views
-2

我有這樣一個字符串列表如下:哈斯克爾 - 獲取第一次出現的指數字符串列表

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

我想讓它返回列表的第一個位置的功能那裏是包含字符'b'的項目。我如何在Haskell中做到這一點?

+4

什麼一直是你的方法,到目前爲止列表的第一個元素?你能寫一個函數來測試一個字符是否出現在字符串中嗎?例如,'contains'aba''b''會返回'True'。 – bheklilr

+0

@bheklilr就我所見,這個函數已被棄用。相反,可以使用isInfixOf,在這種情況下'isInfixOf「b」「aba」'將返回'True' – molinet

+0

我實際上並不知道已經有一個'contains'函數,我打算讓你自己寫= P I假設這是一項任務,它應該可以幫助你教你如何在鏈表上進行遞歸,在這種情況下,你應該儘可能地實現儘可能多的學習。 – 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提供了一種安全的替代head將返回Nothing,而不是崩潰對空列表。

+1

您可以使用'listToMaybe'而不是'safeHead'。 – 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 

有了這一點,你可以找到包含'b'

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