Haskell:在水平线上移动图像

时间:2016-04-08 12:38:56

标签: haskell functional-programming

我是Haskell的新手,正在处理代表type Img = [String]的图像。 我想通过换行将图像向左或向右移动1行或更多行。

我已经手动上下移动图片,代码如下:

moveVer :: Int -> Img -> Img
moveVer n xs = take len $ drop (mod n len) $ cycle xs
      where len = length xs

img 1 = XXXXXX       OUTPUT = (moveVer (3)(img 1))  = XX
          XX                                          XX
          XX                                        XXXXXX  
          XX                                        XXXXXX
        XXXXXX                                        XX

现在我试图做同样的事情,但水平移动图像(左或右)。 定义moveHor :: Int -> Img -> Img

的函数

1 个答案:

答案 0 :(得分:1)

基本算法与垂直移位函数相同,因为String也是字符列表[Char]

您可以将算法推广到move函数,因为moveVer的代码实际上只需要一个列表而且不依赖于Img

move :: Int -> [a] -> [a]
move n xs = take len $ drop (mod n len) $ cycle xs
  where len = length xs

现在,您可以根据moveVer

重写move函数
moveVer :: Int -> Img -> Img
moveVer = move

由于字符串只是一个字符列表,您可以映射字符串列表并使用move函数进行水平移动。

moveHor :: Int -> Img -> Img
moveHor n = map $ move n