Haskell,可遍历从 Maybe [list] 获取值
Haskell, traversable getting values from Maybe [list]
发现需要使用 Traversable
。它 returned 这样的列表生成:fReplList = Just [2,4..100]
.
我知道如何 return Maybe
列表中的值,例如:[Just 1, Just 2, Nothing]
,但我不知道如何对可能列表进行模式匹配,例如:Just [2,4,6,8..100]
。我(仍然)是初学者,在这些基本问题上我仍然 运行 感觉很糟糕,但也许你可以提供帮助。
您可以在 Maybe [Int]
上进行模式匹配,就像在任何 Maybe a
上进行模式匹配一样:
foo (Just x) = x
foo Nothing = -- ?
问题是:在 Nothing 情况下你return 做什么?(要清楚,上面的代码片段无法编译,因为 foo
在 Nothing
情况下 return 没有任何东西。)
有时,您可以决定对 Just
内部的 x
做一些事情,然后将结果放回 Just
案例中:
map' f (Just x) = Just (f x)
map' _ Nothing = Nothing
这正是 fmap
已经为 Maybe a
所做的,这就是我将示例函数命名为 map'
的原因。使用 fmap
,您可以像这样映射 Maybe [Int]
:
Prelude> fmap show (Just [2,4,6,8,100])
Just "[2,4,6,8,100]"
请注意,这会将整个列表变成 String
,因为 fmap
适用于 Maybe
,而不适用于 []
。
虽然一般来说,很难说 return 在 Nothing
的情况下是什么,但对于列表(和其他幺半群)来说,自然 'default value' 存在。所以,专门针对 Maybe [a]
,你可以这样写:
maybeListToList :: Maybe [a] -> [a]
maybeListToList (Just xs) = xs
maybeListToList Nothing = []
使用它可能如下所示:
*Q54645038> maybeListToList (Just [2,4,6,8,100])
[2,4,6,8,100]
*Q54645038> maybeListToList Nothing
[]
但这并不是真正必要的,因为您可以将 Data.Maybe
和标准 Prelude
中的现有功能结合起来以获得相同的功能:
Prelude Data.Maybe> maybeToList (Just [2,4,6,8,100])
[[2,4,6,8,100]]
Prelude Data.Maybe> concat (maybeToList (Just [2,4,6,8,100]))
[2,4,6,8,100]
Prelude Data.Maybe> concat (maybeToList Nothing)
[]
注意 maybeToList
如何将任何 Maybe a
变成列表。当 a
已经是一个列表时,您会得到一个嵌套列表,然后您可以使用 concat
.
将其展平
发现需要使用 Traversable
。它 returned 这样的列表生成:fReplList = Just [2,4..100]
.
我知道如何 return Maybe
列表中的值,例如:[Just 1, Just 2, Nothing]
,但我不知道如何对可能列表进行模式匹配,例如:Just [2,4,6,8..100]
。我(仍然)是初学者,在这些基本问题上我仍然 运行 感觉很糟糕,但也许你可以提供帮助。
您可以在 Maybe [Int]
上进行模式匹配,就像在任何 Maybe a
上进行模式匹配一样:
foo (Just x) = x
foo Nothing = -- ?
问题是:在 Nothing 情况下你return 做什么?(要清楚,上面的代码片段无法编译,因为 foo
在 Nothing
情况下 return 没有任何东西。)
有时,您可以决定对 Just
内部的 x
做一些事情,然后将结果放回 Just
案例中:
map' f (Just x) = Just (f x)
map' _ Nothing = Nothing
这正是 fmap
已经为 Maybe a
所做的,这就是我将示例函数命名为 map'
的原因。使用 fmap
,您可以像这样映射 Maybe [Int]
:
Prelude> fmap show (Just [2,4,6,8,100])
Just "[2,4,6,8,100]"
请注意,这会将整个列表变成 String
,因为 fmap
适用于 Maybe
,而不适用于 []
。
虽然一般来说,很难说 return 在 Nothing
的情况下是什么,但对于列表(和其他幺半群)来说,自然 'default value' 存在。所以,专门针对 Maybe [a]
,你可以这样写:
maybeListToList :: Maybe [a] -> [a]
maybeListToList (Just xs) = xs
maybeListToList Nothing = []
使用它可能如下所示:
*Q54645038> maybeListToList (Just [2,4,6,8,100])
[2,4,6,8,100]
*Q54645038> maybeListToList Nothing
[]
但这并不是真正必要的,因为您可以将 Data.Maybe
和标准 Prelude
中的现有功能结合起来以获得相同的功能:
Prelude Data.Maybe> maybeToList (Just [2,4,6,8,100])
[[2,4,6,8,100]]
Prelude Data.Maybe> concat (maybeToList (Just [2,4,6,8,100]))
[2,4,6,8,100]
Prelude Data.Maybe> concat (maybeToList Nothing)
[]
注意 maybeToList
如何将任何 Maybe a
变成列表。当 a
已经是一个列表时,您会得到一个嵌套列表,然后您可以使用 concat
.