Haskell:为图像定义滚动函数

Haskell:为图像定义滚动函数,haskell,functional-programming,Haskell,Functional Programming,我是Haskell的新手,正在处理表示为类型Img=[String]的图像。 我想创建一个函数,将图像上下移动1行或多行 下面是一个图像示例 img 1= [ "XX XX" , " X " , "XX XX" ] 我的目标是编写一个函数moveImg::Int->Img->Img,垂直转换图像,并将其包装起来;e、 g: moveImg 1 (img 1) = -- Move up by 1 [ " X

我是Haskell的新手,正在处理表示为
类型Img=[String]
的图像。 我想创建一个函数,将图像上下移动1行或多行

下面是一个图像示例

img 1= [ "XX XX"          
       , "  X  "
       , "XX XX"
       ]      
我的目标是编写一个函数
moveImg::Int->Img->Img
,垂直转换图像,并将其包装起来;e、 g:

 moveImg 1 (img 1) = -- Move up by 1
   [ "  X  "
   , "XX XX"  
   , "XX XX"          
   ]

 moveImg (-1) (img 1) =  -- Move down by 1
   [ "XX XX"  
   , "XX XX"     
   , "  X  "
   ]

你朋友的代码不起作用,因为它缺少模运算符——所以旋转没有“环绕”。卡斯滕的代码是有效的(他的代码是通过将列表与自身堆叠,然后取适当的片段来工作的;因为列表是堆叠的,所以它会“包装”);这里有一个替代方案。这只是一个例子

我们将列表分为两半——我们
mod
为了启用旋转,
将前面换成后面,并将它们加在一起<代码>交换
对元组起作用(元组
splitAt
返回)
uncurry
只是强制列表串联(
++
)处理由两个独立参数组成的元组。它将类型为
a->b->c
的函数转换为类型
(a,b)->c

下面是一些测试--
表单
就像for循环一样用于按顺序打印每一行

    import Control.Monad (forM_)
    main = do
      let img = ["XX XX",          
                 "  X  ",
                 "XX XX"]      
      putStrLn "Up is positive"
      forM_ (rotate 1 img) print
      putStrLn "Down is negative"
      forM_ (rotate (-1) img) print
提供以下输出:

    Up is positive
    "  X  "
    "XX XX"
    "XX XX"
    Down is negative
    "XX XX"
    "XX XX"
    "  X  "
如果需要,可以创建
向上
/
向下
数据类型,而不是使用正值/负值。e、 g

    data Direction = Up | Down
    rotate :: Direction -> Int -> [String] -> [String]
    rotate d k xs = . . . 

也许可以采用一种更基本的方法

moveImg n xs = take len $ drop (mod n len) $ cycle xs
        where len = length xs

“你能展示一下你到目前为止都做了些什么吗?”达夫-我和一个朋友一起工作,他在这个问题上认识一些哈斯克尔。他想出了----------移动n as=头ts:(hs++尾ts)where(hs,ts)你希望它如何工作?试着解决这个问题:
让transSym I xs=let l=length xs in take l$drop(I`mod`l)(xs++xs)
向上
>
向下
-I=-1)
)这是一个家庭作业问题吗?我很确定他会复制并粘贴这个,然后带着另一个问题回来,这里需要横向完成。
moveImg n xs = take len $ drop (mod n len) $ cycle xs
        where len = length xs