在Haskell中只获取Maybe的Value组件

时间:2015-12-08 03:08:10

标签: haskell

有一个返回的函数:

>>> ["Just (Number 8000.0)","Just (Number 93.0)","Just (String \"test\")"]

获得价值观的最佳方法是什么?

>>> ["8000.0", "93.0", "test"]

代码正试图使用​​Aeson的prism来解析JSON。

代码

jsonFile :: FilePath
jsonFile = "test.json"

getJSON :: IO BS.ByteString
getJSON = BS.readFile jsonFile

main :: IO ()
main = do
     input <- getJSON
     print $ f input

f :: BS.ByteString -> [String]
f x = [ show $ (x ^? key "a" . nth 0 . key "b")
        , show $ x ^? key "a" . nth 0 . key "c"
        , show $ x ^? key "a" . nth 0 . key "d" 
        ]

1 个答案:

答案 0 :(得分:8)

来自Data.Maybe

catMaybes只会在列表中留下Just个值,并放弃任何Nothing个。

(提示:您可以使用Hoogle搜索[Maybe a] -> [a])。

更新:如果您想用其他内容替换Nothing,请使用fromMaybe和您的默认值,即

map (fromMaybe "Nothing") (f x)

看起来你在列表中有字符串而不是Maybe;您必须从每个元素中移除show来电。

再次更新:让我们将所有内容转换为字符串!

map (fromMaybe "nothing" . fmap show)

外部map将转换应用于每个元素。 fmap show会将Just内的值转换为字符串并单独留下Nothing(请注意将1转换为字符串"1"

> map (fmap show) [Just 1, Nothing]
[Just "1",Nothing]

然后fromMaybe "nothing"解包Just个值,并用您选择的字符串替换Nothing

> map (fromMaybe "nothing" . fmap show) [Just 1, Nothing]
["1","nothing"]

我建议您在使用Haskell时更密切关注类型,将所有内容转换为字符串会消除使用类型良好的语言的好处。