Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 在Haskell中遍历地图数据结构_Loops_Haskell_Dictionary - Fatal编程技术网

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…
from
Data.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)