2011-06-08 68 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