我有一个数据类型列表,我想找到与第一个值匹配的数据类型(如果存在)。如果它不存在,我想返回一个默认值。
data MyType = MyType String Int
findOrMake :: [MyType] -> String -> Int
findOrMake list x = do i <- -- find index
-- if i is a value, return the x[i]
-- if i is not a value, return (MyType x 0)
我有一种直觉,我应该使用fmap
和find
,但我之前从未使用过。
答案 0 :(得分:4)
简单的递归解决方案怎么样?
data MyType = MyType String Int
findOrMake :: [MyType] -> String -> Int
findOrMake [] s = 42
findOrMake ((MyType mstr mint):ms) s = if mstr == s then mint else findOrMake ms s
答案 1 :(得分:4)
要在找不到项目时提供默认设置,您可以使用fromMaybe
:
fromMaybe :: a -> Maybe a -> a
结合find
,它看起来应该是这样的:
fromMaybe defaultValue $ find predicate list