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中是否可行?
你要求的是mapMaybe:
Run Code Online (Sandbox Code Playgroud)mapMaybe :: (a -> Maybe b) -> [a] -> [b]基础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)