2016-04-08 22 views
-6

ハスケルに新しいがあり、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 

今私は同じことを行うが、水平方向(左または右)の画像を移動しようとしています。 Stringも文字、[Char]のリストであるため、定義されたmoveHor :: Int -> Img -> Img

+6

いいえ、あなたは何も管理していません。これは、以前の質問の回答から文字通りコピー&ペーストしたものです。たぶん、実際にあなたがやっていることを理解することは、より良い長期投資です。 –

答えて

1

へ 機能は、基本的なアルゴリズムは、あなたの垂直シフト機能と同じです。

moveVerのコードは本当に唯一のリストを必要としImgに依存しませんので、あなたはmove関数にあなたのアルゴリズムを一般化することができます

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

今、あなたはmoveの面であなたのmoveVer機能を書き換えることができます。

moveVer :: Int -> Img -> Img 
moveVer = move 

文字列は単なる文字リストなので、文字列のリストをマップしてmoveあなたの水平方向の動きをする機能。

moveHor :: Int -> Img -> Img 
moveHor n = map $ move n 
関連する問題