是否有可能在地图功能中有条件?
例如 :
map (> 0 < 100 )[1..10]
Run Code Online (Sandbox Code Playgroud)
如果不可能,那怎么能实现呢?
表达多个过滤条件的好方法是理解,例如
[k | k <- [1..10], k > 2, k < 7]
Run Code Online (Sandbox Code Playgroud)
你也可以避免使用lambda表达式Applicative,它允许将一个参数"提供"给几个函数:
import Control.Applicative
filter ((&&) <$> (>2) <*> (<7)) [1..10]
Run Code Online (Sandbox Code Playgroud)
这可以通过以下轻微的神秘方式扩展到多个测试:
import Control.Applicative
filter (and . ([ (>2) , (<7) , odd ] <*>) . pure) [1..10]
Run Code Online (Sandbox Code Playgroud)
当然,在过滤后,您可以以任何您喜欢的方式映射列表.
[编辑]
如果你想炫耀,你也可以使用箭头:
import Control.Arrow
filter ((>2) &&& (<7) >>> uncurry (&&)) [1..10]
Run Code Online (Sandbox Code Playgroud)
不是那样,我假设你试图得到一个布尔值,表明该值是否大于0且小于100?你有几个选择:
您可以命名一个函数
condition :: Int -> Bool
condition x = x > 0 && x < 100
map condition [1..10]
Run Code Online (Sandbox Code Playgroud)
你可以使用lambda
map (\x -> x > 0 && x < 100) [1..10]
Run Code Online (Sandbox Code Playgroud)
你可以使用Data.Ix和inRange功能
import Data.Ix
-- inRange is inclusive.
map (inRange (1,99)) [1..10]
Run Code Online (Sandbox Code Playgroud)
map用于在列表上映射函数.如果要仅在满足条件的列表元素上映射函数,则应该使用filter:
map (+2) $ filter (>0) [-10..120]
Run Code Online (Sandbox Code Playgroud)
或者如果你有更多条件必须坚持
map (+2) $ filter (>0) $ filter (<100) [-10..120]
Run Code Online (Sandbox Code Playgroud)
或者等价的
map (+2) $ filter (\x -> x>0 && x<100) [-10..120]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3611 次 |
| 最近记录: |