use*_*820 2 dictionary haskell loops
我有一个具有以下结构的地图数据结构: - "英国的首都" - >"伦敦""法国的首都" - >"巴黎"我想循环显示这个问题的地图: "英国的首都是什么",要求用户输入.如果用户回答"伦敦",我打印正确,否则,我打印正确答案"伦敦".这在像C#这样的命令式语言中很容易,但我还没想到如何在Haskell中做到这一点.
Map以这种方式使用的问题是很多遍历Map值的遍历假设您不关心密钥而只关心包含的值.内部有遍历Data.Map,@ danidiaz已指出,但是调用是完全合理的,toList因为该列表将被懒惰地生成,而不是一次强制进入内存.由于元组列表(键,值),您可以遍历使用for或mapM或fmap或....基本结构的任何你喜欢,只要你可以使用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)