2015-10-12 102 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的想法。 –