循环遍历Haskell中的地图数据结构

use*_*820 2 dictionary haskell loops

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

Tho*_*son 8

Map以这种方式使用的问题是很多遍历Map值的遍历假设您不关心密钥而只关心包含的值.内部有遍历Data.Map,@ danidiaz已指出,但是调用是完全合理的,toList因为该列表将被懒惰地生成,而不是一次强制进入内存.由于元组列表(键,值),您可以遍历使用formapMfmap或....基本结构的任何你喜欢,只要你可以使用IO单子.

{-# 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)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)