Haskell映射但删除不符合条件的项目

K S*_*t X 0 dictionary haskell functional-programming

该函数应该采用元组列表,并返回总和> 5的元组

假设我有以下代码:

fn :: [(Int, Int)] -> [(Int, Int)]

fn tuples = map (\(x,y) -> if (x + y) > 5 then (x,y) else (0,0)) tuples
Run Code Online (Sandbox Code Playgroud)

fn [(3,4), (4,4), (0,1)]返回,[(3,4),(4,4),(0,0)]但我真的希望它返回[(3,4),(4,4)]

在仍然遵循类型签名的情况下,这在haskell中是否可行?

tha*_*guy 8

你要求的是mapMaybe:

mapMaybe :: (a -> Maybe b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

基础Data.Maybe

mapMaybe函数的一个版本map可以抛出元素.特别是,函数参数返回类型的东西Maybe b.如果是这样Nothing,则不会在结果列表中添加任何元素.如果是Just b,则b包含在结果列表中.

在代码中使用它的最小变化是:

import Data.Maybe

fn :: [(Int, Int)] -> [(Int, Int)]
fn tuples = mapMaybe (\(x,y) -> if (x + y) > 5 then Just (x,y) else Nothing) tuples
Run Code Online (Sandbox Code Playgroud)

但是,在这种特定情况下,您实际上并未进行转换,只需删除即可.如果您不打算稍后添加转换,filter则更合适:

fn = filter (\(x,y) -> x+y > 5)
Run Code Online (Sandbox Code Playgroud)