2015-10-12 64 views
0

我想使用lambda创建一个函数,它获取参数列表中的对并返回第一个列表的第一个元素列表。例如:使用lambda实现Haskell中的列表函数

function [ (1,2), (3,4) (5,6) ] = [1,3,5] 

我使用lambda这样,但它似乎并没有工作:

firstall [] = [] 
firstall ((a,b) : xs) = (\(a,b) -> a : firstall(xs)) 

也许我这样做完全错误的。有人能帮我吗?现在

firstall ((a,b) : xs) = ((\(a,b) -> a) (a,b) : firstall(xs)) 

,因为你在你的lambda表达式使用ab为好,这样的要价:

+3

你应该*总是*使用类型签名,特别是当你正在学习。如果你有,你会意识到你的代码创建了一个函数列表。 Haskell的类型系统功能强大且有用;用它!在你的情况下,你想'firstall :: [(a,b)] - > [a]'。看看添加时会发生什么。 – crockeea

+0

你想要的是'map fst'。 –

回答

4

你的lambda表达式根本不会被调用,你只定义lambda表达式,你可以叫它麻烦,更方便的版本是:

firstall ((a,b) : xs) = ((\(c,d) -> c) (a,b) : firstall(xs)) 

换句话说你“统一” (c,d)(a,b)。您可以在您的lambda表达式中使用ab,但它为您自己创造了条件。


这是说,你可以执行此任务的方式更容易:

firstall = map fst 

这是短期的:

firstall = map (\(a,b) -> a) 

注意,你不需要指定的输入参数对于firstall,由于map fst是一个函数,它将作为输入列表。


最后,如@DanielWagner表明,可以简单地丢弃lambda表达式:

firstall ((a,_) : xs) = (a : firstall(xs)) 

下划线(_)意味着你不感兴趣的值:你只需要的第一个元素元组。

+2

为lambda提供参数的另一种解决方法是完全删除lambda,写入'a:firstall xs'而不是'\(a,b) - > a:firstall xs'(以便整行变为'firstall ((a,b):xs)= a:firstall xs')。我认为这可能更接近DcCoO的想法。 –