计算 "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
当 a
为 Just 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
中 —— 就按原样使用它。我们做到了。
我正在尝试计算列表索引的模数。
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
当 a
为 Just 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
中 —— 就按原样使用它。我们做到了。