Haskell:显示函数行与unlines完全相反

mor*_*ort 3 haskell

我必须找到一些例子,表明内置的Haskell函数"unlines"不是"行"的完全相反,即,

unlines.lines x != x
Run Code Online (Sandbox Code Playgroud)

其中x是包含换行符的String.我找到了一个例子:

"aa\nbb"
Run Code Online (Sandbox Code Playgroud)

会变成

"aa\nbb\n"
Run Code Online (Sandbox Code Playgroud)

有没有人知道任何其他的例子,没有显示相同的缺陷(即,unlines总是在最后一行后添加换行符)?

澄清:根据自动化测试,我已经解决了任务 - 我只是使用了上述三次.如果有任何其他根本不同的解决方案,我只是感兴趣.

Jon*_*ård 9

如果你使用quickcheck,你可以找到一个较小的:

import Test.QuickCheck
main = quickCheck $ \x -> (unlines . lines) x == x
Run Code Online (Sandbox Code Playgroud)

它会自动缩小反例,因此它通常只报告它找到的最小的一个"a".

我们可以更改属性以仅测试以\n以下结尾的字符串:

import Test.QuickCheck
main = quickCheck $ \x0 -> let x = x0 ++ "\n" in (unlines . lines) x == x
Run Code Online (Sandbox Code Playgroud)

我没有找到任何反例.

您可能也有兴趣测试另一个方向,(lines . unlines).排除其中一个字符串包含换行符的情况,此属性成立.