Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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
Parsing scala collect的Haskell等价物_Parsing_Scala_Haskell - Fatal编程技术网

Parsing scala collect的Haskell等价物

Parsing scala collect的Haskell等价物,parsing,scala,haskell,Parsing,Scala,Haskell,我试图读入一个包含以下表单的键/值对的文件: #A comment a=foo b=bar c=baz Some other stuff 如建议的那样,使用各种其他行。这需要进入一个地图,我可以从中查找钥匙 我最初的方法是读入行并在“=”字符上拆分,得到一个[[String]]。在Scala中,我将使用collect,它接受一个部分函数(在本例中类似于a::b::->(a,b)的>的case x)并将其应用于已定义的位置,在未定义函数的位置丢弃值。Haskell有类似的吗 如果做不到这一点,在

我试图读入一个包含以下表单的键/值对的文件:

#A comment
a=foo
b=bar
c=baz
Some other stuff
如建议的那样,使用各种其他行。这需要进入一个地图,我可以从中查找钥匙

我最初的方法是读入行并在“=”字符上拆分,得到一个
[[String]]
。在Scala中,我将使用
collect
,它接受一个部分函数(在本例中类似于a::b::->(a,b)的
>的case x)并将其应用于已定义的位置,在未定义函数的位置丢弃值。Haskell有类似的吗


如果做不到这一点,在Haskell中,我们将如何做到这一点,或者按照我的思路,或者使用更好的方法?

通常,这是通过
Maybe
类型和
catMaybes
完成的:

catMaybes :: [Maybe a] -> [a]
因此,如果解析函数的类型为:

parse :: String -> Maybe (a,b)
然后,您可以通过将输入字符串解析为行、验证每行并仅返回定义的值来构建映射:

Map.fromList . catMaybes . map parse . lines $ s

其中,
s
是您的输入字符串。

列表单子提供了您要查找的内容。通过列表理解,这可能是最容易利用的,不过,它也适用于do符号

首先,这里是Scala实现,以供参考-

//使用.toList进行更简单的演示
scala>val xs=scala.io.Source.fromFile(“foo”).getLines().toList
列表[字符串]=列表(a=1,b=2,sdkfjhsdf,c=3,sdfkjhsdf,d=4)
scala>xs.map(u.split('=')).collect{case数组(k,v)=>(k,v)}
列表[(字符串,字符串)]=列表((a,1)、(b,2)、(c,3)、(d,4))
现在是使用Haskell的列表理解版本-

λ:m+Data.List.Split

λxs n.b.
catMaybes.map parse=mappaye parse
,其中
mappaye
也来自Data.Maybe。
λ fail "err" :: [a]
[]
map (splitOn "=") xs >>= (
  \s -> case s of
    [k, v] -> return (k, v)
    _ -> fail ""
)