Loops 在Haskell中遍历地图数据结构
我有一个具有以下结构的地图数据结构:- “英国的首都是什么”->“伦敦” “法国的首都是什么”->“巴黎”Loops 在Haskell中遍历地图数据结构,loops,haskell,dictionary,Loops,Haskell,Dictionary,我有一个具有以下结构的地图数据结构:- “英国的首都是什么”->“伦敦” “法国的首都是什么”->“巴黎” 我想在这张地图上循环显示一个问题:“英国的首都是什么”,询问用户输入。如果用户回答“伦敦”,我将打印正确答案,否则,我将打印正确答案“伦敦”。这在C#之类的命令式语言中很容易做到,但我还没有弄清楚如何在Haskell中做到这一点。以这种方式使用Map的问题是对Map值的大量遍历假定您不关心键,只关心包含的值。Data.Map中有遍历,这就足够了,@danidiaz已经指出,但是调用toLi
我想在这张地图上循环显示一个问题:“英国的首都是什么”,询问用户输入。如果用户回答“伦敦”,我将打印正确答案,否则,我将打印正确答案“伦敦”。这在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)
lens
允许您编写@ThomasM.DuBuisson的代码,而无需通过toList
。遍历函数可以在每次迭代时访问索引
main = ifor_ m $ \(q, a) -> do
putStrLn q
x <- getLine
putStrLn (if x == a then "Yes" else "No: " ++ a)
main=ifor\um$\(q,a)->do
putStrLn q
为什么要用地图来做这个?映射用于根据键查找值。如果您只想存储/处理值和键,为什么不使用元组列表呢?在这样一个列表上循环是非常困难的。(如果你只给了一个映射,那么就把它转换成一个元组列表…)为什么这是一个映射字符串而不是[(字符串,字符串)]
?一个简单的种子代码是序列[print(k,v);(k,v)将映射转换成一个列表,然后使用一个“for循环”:forM(map.toList m)$\(k,v)->do…
fromData.Foldable
Data.Map.traverseWithKey
也很有用。Haskell不接受有效的m::Map字符串,我尝试了m:([Char],[Char])但这也不行。@user3480820我建议您将此问题作为一个单独的问题发布。我不知道您正在使用什么代码,运行什么编译命令,或者什么“不接受”真正的意思是在这里。当你问下一个问题时,请确保包括你正在使用的确切代码和编译器错误。请注意,我答案中的第一个代码块是完整的,如果你将它复制并粘贴到foo.hs
文件中,并使用合理的ghc
最新版本对其进行解释或编译,应该可以正常工作。
main = ifor_ m $ \(q, a) -> do
putStrLn q
x <- getLine
putStrLn (if x == a then "Yes" else "No: " ++ a)