Haskell:为图像定义滚动函数
我是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
类型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