2011-06-08 71 views
1

是否有可能在地圖功能中有條件?Haskell在地圖功能中的條件

例如:

map (> 0 < 100)[1..10] 

如果這是不可能的,怎麼可能一個實現這一目標?

+2

什麼,你會期望在該表格的價值? – 2011-06-08 09:16:00

回答

5

不太像那樣,我推測你試圖得到一個布爾值來表示值是否大於0且小於100?您有幾種選擇:

可以命名一個功能

condition :: Int -> Bool 
condition x = x > 0 && x < 100 
map condition [1..10] 

您可以使用lambda

map (\x -> x > 0 && x < 100) [1..10] 

您可以使用Data.IxinRange功能

import Data.Ix 

-- inRange is inclusive. 
map (inRange (1,99)) [1..10] 
+0

inRange只驗證upperBound? :-S – Sudantha 2011-06-08 11:04:42

+0

inRage是兩個Givens之間的值(因此介於1和99之間)。我只是認爲簡化了> 0 && <100邏輯 – 2011-06-08 12:03:57

+1

實際上我通過編寫我自己的inRange函數來解決問題;-)正常工作! – Sudantha 2011-06-08 12:05:15

5

map是用於在列表上映射函數。如果你想只映射在滿足條件的列表的元素的功能,那麼你或許應該使用filter

map (+2) $ filter (>0) [-10..120] 

,或者如果你有更多的條件都必須持有

map (+2) $ filter (>0) $ filter (<100) [-10..120] 

或等效

map (+2) $ filter (\x -> x>0 && x<100) [-10..120] 
7

表達多個過濾器條件的好方法是理解,例如

[k | k <- [1..10], k > 2, k < 7] 

可以避免λ表達式作爲使用公Applicative,其允許「喂」一個參數到幾個功能:

import Control.Applicative 

filter ((&&) <$> (>2) <*> (<7)) [1..10] 

這可以在以下略低隱蔽延長多個測試方式:

import Control.Applicative 

filter (and . ([ (>2) , (<7) , odd ] <*>) . pure) [1..10] 

當然,過濾後,你可以以任何你喜歡的方式映射列表。

[編輯]

如果你想炫耀,你可以使用鼠標,以及:

import Control.Arrow 

filter ((>2) &&& (<7) >>> uncurry (&&)) [1..10] 
+0

@蘭代:哇!美麗!我只是在學習應用函子,這是一個很好的例子!謝謝:) – MarcoS 2011-06-08 13:47:28

+0

@MarcoS:其實這也是一個不錯的箭頭應用程序,所以我也添加了這個版本。但是對於真實世界的應用程序,我會認爲Applicative和Arrow語法有點過分。 – Landei 2011-06-08 15:14:11

+0

@Landei:箭頭仍然超出了我的知識範圍,所以我無法弄清楚你最後一行代碼的含義:)無論如何,謝謝你指出這一點:總有一天我會理解它! – MarcoS 2011-06-08 15:20:52