2015-04-08 98 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