祝大家新年快乐!我很想写这样的东西,但是我知道find可以返回Nothing,有没有比通过Just和Nothing更好的方法呢?
Just
Nothing
snd (find (\t -> fst t == 2) [(1, 2), (2, 3)])
falq053o1#
可以使用**lookup :: Eq a => a -> [(a, b)] -> Maybe b**遍历列表,如果找到与给定键关联的值,则返回Just 3,如果没有这样的值,则返回Nothing。因此,
lookup :: Eq a => a -> [(a, b)] -> Maybe b
Just 3
ghci> lookup 1 [(1, 2), (2, 3)] Just 2 ghci> lookup 2 [(1, 2), (2, 3)] Just 3 ghci> lookup 3 [(1, 2), (2, 3)] Nothing
bksxznpy2#
假设我们将find定义为:
find
find _ [] = Nothing find p (x:xs) | p x = Just x | otherwise = find p xs
现在:
find (\(x, _) -> x == 2) [(1, 2), (2, 3)] -- Just (2,3)
如果您希望能够将函数应用于Maybe结果,而不必显式匹配值,则可能需要类似于以下内容的代码:
Maybe
(>>>) (Just x) f = Just (f x) (>>>) Nothing _ = Nothing
find (\(x, _) -> x == 2) [(1, 2), (2, 3)] >>> snd -- Just 3 find (\(x, _) -> x == 2) [(1, 2), (3, 3)] >>> snd >>> (* 2) -- Nothing
对于Just x结果,函数以x作为参数进行计算;对于Nothing,Nothing只是简单地传播。
Just x
x
2条答案
按热度按时间falq053o1#
可以使用**
lookup :: Eq a => a -> [(a, b)] -> Maybe b
**遍历列表,如果找到与给定键关联的值,则返回Just 3
,如果没有这样的值,则返回Nothing
。因此,
bksxznpy2#
假设我们将
find
定义为:现在:
如果您希望能够将函数应用于
Maybe
结果,而不必显式匹配值,则可能需要类似于以下内容的代码:现在:
对于
Just x
结果,函数以x
作为参数进行计算;对于Nothing
,Nothing
只是简单地传播。