地图函数中的Haskell条件

Sud*_*ha 1 haskell map

是否有可能在地图功能中有条件?

例如 :

map (> 0 < 100 )[1..10]
Run Code Online (Sandbox Code Playgroud)

如果不可能,那怎么能实现呢?

Lan*_*dei 7

表达多个过滤条件的好方法是理解,例如

[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)


Jef*_*ter 5

不是那样,我假设你试图得到一个布尔值,表明该值是否大于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.IxinRange功能

import Data.Ix

-- inRange is inclusive.
map (inRange (1,99)) [1..10]
Run Code Online (Sandbox Code Playgroud)


Mar*_*coS 5

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)