【问题标题】:Looping through a map data structure in Haskell在 Haskell 中循环遍历地图数据结构
【发布时间】:2017-03-02 20:33:01
【问题描述】:

我有一个具有以下结构的地图数据结构:- “英国的首都是什么”->“伦敦” “法国的首都是什么”->“巴黎” 我想循环浏览显示问题的地图:“英国的首都是什么”,要求用户输入。如果用户回答“伦敦”,我打印正确,否则,我打印正确答案“伦敦”。这在像 C# 这样的命令式语言中很容易,但我还没有想出如何在 Haskell 中做到这一点。

【问题讨论】:

  • 你为什么要使用地图?地图用于根据键查找值。如果您只想存储/处理值和键,为什么不使用元组列表呢?循环遍历这样的列表是trivial。 (如果你给出的只是一张地图,那么只需将它转换为一个元组列表......)
  • 为什么是Map String String 而不仅仅是[(String, String) ]
  • 一个简单的种子代码是sequence_ [print (k,v) | (k,v) <- toList theMap]
  • 将地图转换为列表,然后使用“for循环”:forM_ (Map.toList m) $ \(k,v) -> do ... from Data.Foldable
  • Data.Map.traverseWithKey 也很有用。

标签: loops haskell dictionary


【解决方案1】:

以这种方式使用Map 的问题是很多对Map 值的遍历假设您不关心键而只关心包含的值。 Data.Map 内部有遍历就足够了,@danidiaz 已经指出,但是调用 toList 是完全合理的,因为该列表将被延迟生成,而不是一次强制进入内存。给定一个元组列表(键、值),您可以使用 formapMfmap 或 .... 基本上任何您喜欢的构造,只要您可以使用 IO monad。

{-# LANGUAGE OverloadedLists #-}
import Data.Foldable (for_)
import Data.Map (Map,toList)

m :: Map String String
m = [("a","1"),("b","2")]

main =
  for_ (toList m) $ \(q,a) ->
    do putStrLn q
       x <- getLine
       putStrLn (if x == a
                    then "Yes"
                    else "No: " ++ a)

编辑:我觉得有必要使用mapM_添加大多数人称之为更惯用的Haskell:

main :: IO ()
main = mapM_ ask (toList m)

ask :: (String,String) -> IO ()
ask (q,a) = do putStrLn q
               x <- getLine
               putStrLn (if x == a then "Yes" else "No: " ++ a)

【讨论】:

  • Haskell 不接受 m::Map String String 作为有效的,我试过 m :: ([Char],[Char]) 但这也不起作用。
  • @user3480820 我建议您将此问题作为一个单独的问题发布。我不知道您正在使用什么代码,您运行了什么编译命令,或者“不接受”在这里的真正含义。当您问下一个问题时,请务必包含您正在使用的确切代码和编译器错误。请注意,我的答案中的第一个代码块是完整的,如果您将其复制并粘贴到 foo.hs 文件中并使用相当新的 ghc 版本解释或编译它,它应该可以正常工作。
【解决方案2】:

lensifor_ combinator 允许您编写@ThomasM.DuBuisson 的代码,而无需通过toList。遍历函数在每次迭代时都可以访问索引。

main = ifor_ m $ \(q, a) -> do
    putStrLn q
    x <- getLine
    putStrLn (if x == a then "Yes" else "No: " ++ a)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-01
    • 2021-06-18
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多