排列一个符号,Haskell

时间:2014-12-13 17:45:25

标签: haskell permutation

如何将一个符号置换回来。我有一个给定的字符串:abcdpqrs,其中输出为:badcqpsr

我目前的代码:

f s = foldr (\a ~(x,y) -> (a:y,x)) ([],[]) s

main :: IO ()
main = do 
    str <- getLine
    print(f str)

评估f "abcdpqrs"结果

("acpr",
 "bdqs")

如何使用"badcqpsr"


更新的代码:

rev (a : b : xs) = b : a : rev xs
rev xs = xs
main = do
    n <- getLine
    l <- getContents
    putStr (rev l)

当输入为2个字符串时,abcdpqrsaz结果为badcqpsraz。预期输出为badcqpsrza。我怎么解决它?

1 个答案:

答案 0 :(得分:0)

这是一个提示:

reverseFirst2 :: [a] -> [a]
reverseFirst2 (x1:x2:xs) = x2:x1:xs
reverseFirst2 xs = xs

这会颠倒列表前两个元素的顺序

> reverseFirst2 "abcdpqrs"
"bacdpqrs"

你能否填写下面的...来对列表的其余部分做同样的事情?

reverseEvery2 :: [a] -> [a]
reverseEvery2 (x1:x2:xs) = x2:x1: ...
reverseEvery2 xs = xs

获取输入

要一次输入一行,请一次读取一行输入。

main = do
    l <- getLine
    print (reverseEvery2 l)
    main

您使用getContents获得该行为的原因是从getContents读取的输入包括行尾的换行符。它基本上正在运行

rev "abcdpqrs\naz\n" =
    "badcqpsra\n\nz"