将String转换为bigram列表

时间:2013-06-10 18:32:40

标签: haskell

我开始学习haskell了,我需要你帮助的东西可能很简单,但我无法解决。

我有一个字符串:

ABCDEFG

我需要将此字符串转换为以下格式:

A-B
B-C
C-D
D-E
E-F
F-G

有人可以给我一些提示吗? 谢谢。

2 个答案:

答案 0 :(得分:6)

只需使用zip中的Data.List,就像这样:

let str = "ABCDEFG"
in zip str $ tail str

返回对[(Char, Char)]对的列表。

然后输出类似问题的内容,你可以这样做:

main :: IO ()
main = do
  let str     = "ABCDEFGH"
      couples = zip str $ tail str
  mapM_ (\(x,y) -> putStrLn $ x : '-' : y : "") couples 

答案 1 :(得分:4)

您可以使用zipdrop配对连续的字符:

let str = "ABCDEFG"
let pairs = zip str (drop 1 str)

然后您可以映射字符对列表以创建字符串:

map (\(f, s) -> f:'-':s:[]) pairs

给出了一个字符串列表。

正如评论所指出的那样,您可以使用zipmap代替drop 1zipWithtail

zipWith (\f s -> f:'-':s:[]) str (tail str)

您可以在一行中执行此操作:

let stringList = map (\(f, s) -> f:'-':s:[]) $ zip str (drop 1 str)

如果您需要单个输出字符串,可以使用unlines例如

let str = unlines stringList

作为单一功能:

formatPairs :: String -> String
formatPairs str = unlines $ map (\(f, s) -> f:'-':s:[]) $ zip str (drop 1 str)

formatPairs :: String -> String
formatPairs str = unlines $ zipWith (\f s -> f:'-':s:[]) str (tail str)

如果您需要打印,可以使用putStr

putStr (formatPairs "ABCDEFG")