Haskell:如何将字符串转换为布尔矩阵

hel*_*mus 2 haskell matrix type-conversion

我需要一些Haskell的帮助.我想读取一个字符串并将该字符串转换为布尔值列表的列表.例如,"LLL\nbbb\nLLL"应该产生以下列表:[[True,True,True],[False,False,False],[True,True, True]].应该忽略任何其他事情.

我是函数式编程的新手.我尝试了以下方法:

StringParse :: String -> Matrix
StringParse s =
    case s of
            "L" -> Matrix [[True]] 
            "b" -> Matrix [[False]]
Run Code Online (Sandbox Code Playgroud)

使用数据类型Matrix:

data Matrix = Matrix [[Bool]]

lef*_*out 5

您首先在子问题中拆分您的任务.

  • 为每个换行符分块列表.实际上,有一个标准功能就是这样:lines.
  • 删除任何你不期望的东西.这可能是一项工作filter.
  • 将每个L转换为一个True值,每个b转换为一个False.那只是一个map操作.
  • 需要对每个块/行执行前两个步骤,因此您需要再次map将它们应用于行列表.
  • 将所有内容打包在Matrix数据构造函数中.

在Haskell中将所有链接在一起非常容易:

parse :: String -> Matrix
parse = Matrix . map (map decide . filter isKnown) . lines
 where decide 'L' = True
       decide 'b' = False
       isKnown 'L' = True
       isKnown 'b' = True
       isKnown _ = False
Run Code Online (Sandbox Code Playgroud)

那将是一个非常好的解决方案.

实际上,在这里合并第二步和第三步可能更好:不是首先选择我们可以处理的值,然后在单独的情况下处理相同的值集,我们可以同时执行这两个步骤.IMO最好的方式,虽然它现在可能让你困惑,但是使用列表是monad的事实:

parse' :: String -> Matrix
parse' = Matrix . map translate . lines
 where translate line = do
         ch <- line
         case ch of 'L' -> [True]
                    'b' -> [False]
                    _   -> []
Run Code Online (Sandbox Code Playgroud)