计算 "Just int" 在 Haskell 中的模数

Calculate module of "Just int" in Haskell

我正在尝试计算列表索引的模数。

list=[5,6,7,8]
a = elemIndex 7 list
b = mod a 2

理想情况下,这会给我 b = 0 因为 a = 2(技术上)。 但是我收到错误消息,因为 a 不是 2 而是 Just 2.

您可以使用 fmap :: Functor f => (a -> b) -> f a -> f b or its operator variant (<$>) :: Functor f => (a -> b) -> f a -> f b 来执行此操作,以将函数应用于包装在 Just … 数据构造函数中的项目:

b = (`mod` 2) <b><$></b> a

aJust 2 时,这将 return Just 0,如果 elemIndex returned,则 Nothing一个Nothing。这意味着如果 elemIndex 失败(因为索引超出范围),b 将是 Nothing.

Maybe 值保证为 Just _:

时,您可以只使用与 let 的模式匹配来到达 Maybe 值的内部
list = [5,6,7,8]
a = elemIndex 7 list
b = mod a 2

foo list = [b | n <- [5,6,7,8]
              , let a = elemIndex n [5,6,7,8]
              , let Just i = a
              , let b = mod i 2]
         = [b | n <- list
              , let Just i = elemIndex n list
              , let b = mod i 2]
         = [b | (_, i) <- zip list [0..]
              , let b = mod a 2]
         = ls where ls = [0,1] ++ ls

bar list = [(n,b) | n <- list
                  , let Just i = elemIndex n list
                  , let b = mod i 2]
         = [(n,b) | (n, i) <- zip list [0..]
                  , let b = mod i 2]
         = zip list ls where ls = cycle [0,1]

通常这种模式匹配是不受欢迎的,因为它是 部分 ,即如果值实际上是 Nothing 可能会导致错误,但在这里它是正确的建筑。

但是说真的,为什么要把它放到 Just 中 —— 就按原样使用它。我们做到了。