2015-04-08 52 views
1

例如原(41.12, [1,2,3,0])Haskell的列表添加到元組

name = ["pete","ben","bill","bob"] 

例如輸出(41.12, [1,2,3,0], ["ben","bill","bob","pete"])

到目前爲止的代碼:

getnames :: (Double, [Int]) -> (Double, [Int] -> [[Char]]) 
getnames (nil , []) = error "List is empty" 
getnames xs = [(doublevalue , listofints, listofstrings)) | x <- xs] 

我如何使用INT名單獲得從名單中的值,並把它放在元組中(我知道當我將它添加到薄紗中時,它不再是元組)

我會用什麼方法來做到這一點?

+3

你試過了什麼?有任何想法嗎?你知道一個函數/運算符,它給你一個基於索引的列表元素嗎?如果不是,你可以寫一個嗎? – Carsten

+1

您的類型簽名現在說「採用包含double和int列表的有序對,並返回包含double和從int列表中的函數到字符串列表的有序對」。你究竟想在這裏完成什麼? –

+0

如果你試圖製作一個可變大小的元組,那是不可能的。 –

回答

3

操作(!!)可用於索引列表。給定一對,你可以使用的線沿線的東西:

getnames :: (Double, [Int]) -> [String] -> (Double, [Int], [String]) 
getnames (dbl, ixes) names = 
    let namesLst = map (names !!) ixes in 
    (dbl, ixes, namesLst) 

Live demo

爲了得到你想要的東西,我已經固定您的簽名能夠通過名稱和固定回報值類型(它在最後返回一個具有函數的三元組)。另請注意,[Char]String是完全相同的類型。

因此函數體內部你有dbl這是你的兩倍,並直接轉發到最終的三倍。然後你有ixes這是你必須從ixes採取的元素的索引。

在這一點上,我們通過映射在指數的指數函數來得到正確的順序名稱計算namesLst。一旦我們有了這份名單,我們就必須把它放在三聯的第三個元素中。

如果你希望它失敗的空索引列表上(即使這些名稱列表爲空),那麼你可以添加:

getnames (_, []) _ = error "..." 

其中_的意思是「我不關心不夠命名這種說法」 。可以看作是你不會使用的參數的佔位符。

+0

很好 - 單獨的實時演示+ 1 - 以前從未見過 - 感謝演示:D – Carsten