2017-03-15 49 views
0

我需要對列表的每個元素應用一個操作。操作是「y =(3 * x)rem 16」。在這種情況下,我(想我)不能使用地圖功能。如何將更復雜的操作應用於列表的每個元素?

例:

x = [0 1 2 3 4 5 6] 

y = [0 3 6 9 12 15 2] 

我funcional編程很新,特別是Haskell的,所以我遇到一些麻煩一點。

感謝

+5

*爲什麼*你認爲你不能使用'map'? – crockeea

回答

0

使用列表理解:

[(3 * x) `rem` 16 | x <- data_source] 

你也可以試試這個,雖然它可能看起來不是那麼可讀的,但它涉及map

map ((flip rem) 16) $ map (3*) data_source 

這裏的它是如何工作的:

  • map (3*) data_source乘以3的data_source每個元素,非常簡單
  • map ((flip rem) 16) $ stuff功能((flip rem) 16)適用於stuff
    • (flip rem) 16每個元素是一個參數x的一個函數,計算的rem x 16

現在,您可以使用rem 16而不是flip ping業務,但在這種情況下,函數將返回rem 16 x,而不是您想要的。


你也可以利用這一點,它看起來比第二版更清潔了一下:

map (((flip rem) 16) . (3*)) data_source 

的點(.),如function1 . function2創建其工作方式如下的複合函數:function1 $ function2 x

+1

考慮你正在接聽的學生的水平。看來這個學生從來沒有見過拉姆達;這是一個相當先進的答案考慮。 (構圖,HOFs,章節......) – luqui

+0

@luqui,我試着從最簡單的例子開始,然後轉移到一些更復雜的東西,同時解釋代碼如何工作。順便說一句,感謝您在一個月前剛剛開始學習Haskell時稱我的答案'非常先進':D看起來我並沒有太糟糕。 – ForceBru

+0

列表理解解決方案是完全可讀和可愛的。免費的東西是「先進的」,因爲它表明你掌握了一些有用的技術,但最好不要在這裏應用。 – amalloy

4

你絕對可以使用map,你只需要定義你想要在列表上映射的函數。

fancypants x = (3*x) `rem` 16 

ghci> map fancypants [0,1,2,3,4,5,6] 
相關問題