haskell 有没有可能用“也许”更有表现力?

fnatzsnv  于 2022-12-23  发布在  其他
关注(0)|答案(2)|浏览(153)

祝大家新年快乐!我很想写这样的东西,但是我知道find可以返回Nothing,有没有比通过JustNothing更好的方法呢?

snd (find (\t -> fst t == 2) [(1, 2), (2, 3)])
falq053o

falq053o1#

可以使用**lookup :: Eq a => a -> [(a, b)] -> Maybe b**遍历列表,如果找到与给定键关联的值,则返回Just 3,如果没有这样的值,则返回Nothing
因此,

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
bksxznpy

bksxznpy2#

假设我们将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结果,而不必显式匹配值,则可能需要类似于以下内容的代码:

(>>>) (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作为参数进行计算;对于NothingNothing只是简单地传播。

相关问题