【问题标题】:Formating output of Haskell permutation格式化 Haskell 置换的输出
【发布时间】:2018-07-03 22:56:26
【问题描述】:

我的 .hs 文件中有这个列表

listofstrings= ["string1", "string2", "string3", "string4"]

我在 ghci 中使用

调用文件
load permutations.hs

用这个命令

permutations listofstrings

我明白了

[["string1","string2","string3","string4"],["string2","string1","string3","string4"],["string3","string2","string1","string4"],["string2","string3","string1","string4"],["string3","string1","string2","string4"],["string1","string3","string2","string4"],["string4","string3","string2","string1"],["string3","string4","string2","string1"],["string3","string2","string4","string1"],["string4","string2","string3","string1"],["string2","string4","string3","string1"],["string2","string3","string4","string1"],["string4","string1","string2","string3"],["string1","string4","string2","string3"],["string1","string2","string4","string3"],["string4","string2","string1","string3"],["string2","string4","string1","string3"],["string2","string1","string4","string3"],["string4","string1","string3","string2"],["string1","string4","string3","string2"],["string1","string3","string4","string2"],["string4","string3","string1","string2"],["string3","string4","string1","string2"],["string3","string1","string4","string2"]]

如何获得每个带有换行符且不带逗号、"、[]、空格和其他符号的组合的列表?

所以它应该是这样的

string1string2string3string4
string2string1string3string4
string3string2string1string4
string2string3string1string4
string3string1string2string4
string1string3string2string4
string4string3string2string1
string3string4string2string1
string3string2string4string1
string4string2string3string1
string2string4string3string1
string2string3string4string1
string4string1string2string3

【问题讨论】:

  • @nicodp 是否有任何命令可以提供string1 string1string2 string1string2string3 string1string2string3string4 string2 string2string1string3string4 等 :) ?

标签: string haskell concatenation


【解决方案1】:

你可以用concat连接每个子列表的字符串,然后你可以用unlines连接行:

unlines (concat <$> permutations listofstrings)

Here's an example

【讨论】:

  • 谢谢。我试过repl.it/@jonasss/RespectfulDarkorchidIrishwaterspaniel 但这不起作用。这是我的错吗?
  • 你的错没有准确解释什么不起作用以及如何起作用。如果我不知道症状,我就无法诊断问题。
  • 在您的示例中,您已经从第一篇文章的示例中获取了 listofstrings= ["string1", "string2", "string3", "string4"] 的输出。在那个字符串列表上,我想执行 permutations 命令,并且在那里生成的输出很好地由您的建议格式化。如何修复它以使字符串输入通用?其次,如何将其写入文件?
  • 我还在 .hs 文件中尝试了代码 import Data.List listofstrings= ["string1", "string2", "string3", "string4"],并使用 ghci 我执行了 *Main&gt; permutations listofstrings; joined = unlines (concat &lt;$&gt; listofstrings); putStr joined,但这不起作用
【解决方案2】:

您可以做的是使用map 获取一个新的字符串列表,但每行都附加了换行符:

listsWithNewLines = map (++ ["\n"]) $ permutations listofstrings

然后使用mapM_将它们打印出来:

mapM_ putStr (concat listsWithNewLines)

为什么是mapM_?因为你想执行一个不返回任何()IO 操作,换句话说,你想在IO monad 中进行一些计算。

让我们回顾一下mapM_的类型:

mapM_ :: Monad m => (a -> m b) -> [a] -> m ()

我们的计算将是putStr,具有以下类型:

putStr :: String -> IO ()

由于我们想要一个字符串列表作为mapM_ 的第二个参数,我们需要用新的行来展平我们的字符串列表,如下所示:concat listWithNewLines

因此,我们最终得到以下类型:

(String -> IO ()) -> [String] -> IO ()

这是mapM_的类型,但有a = Stringb = ()m = IO

【讨论】:

  • 谢谢。以及如何组合多个命令?因为你在“*Main>”中一个接一个地写了“然后你可以”?​​span>
  • 第一个命令给了我那个错误&lt;interactive&gt;:1:47: error: * Couldn't match type Char' with [Char]' Expected type: [[[Char]]] Actual type: [[Char]] * In the second argument of map', namely listofstrings' In the expression: map (\ ls -&gt; ls ++ ["\n"]) listofstrings In an equation for listsWithNewLines': listsWithNewLines = map (\ ls -&gt; ls ++ ["\n"]) listofstrings
  • 已编辑,您应该使用 listofstrings 而不是 permutations listofstrings
  • 伟大的 nicodp!以及如何将输出写入 Windows 上的文本文件?
  • 可以往这个方向走吗? import Data.Set import Data.Maybe import Text.Printf import System.IO import System.Environment import Data.List listofstrings = ["string1", "string2", "string3", "string4"] main = listsWithNewLines &lt;= map (\ls -&gt; ls ++ ["\n"]) (permutations listofstrings) mapM_ putStr (concat listsWithNewLines) writeFile :: ./outpu -&gt; mapM_ -&gt; IO ()
猜你喜欢
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
相关资源
最近更新 更多