2016-04-07 6 views
1

ハスケルに新しいです。画像はtype Img = [String]として扱っています。 イメージを1行または複数行上に移動する関数を作成したいとします。ハスケル:画像のロール関数を定義する

下記の画像例。

img 1= [ "XX XX"   
     , " X " 
     , "XX XX" 
     ]  

私の目標は、オーバーラップし、垂直方向に画像を変換する機能moveImg :: Int -> Img -> Imgを書くことです。例:

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 " 
    ] 
+2

はあなたがこれまでにしようとしているかを示すことができますすることができますか? – duffn

+0

@duffn - 私はこの問題に関していくつかのハズケルを知っている友人と働いていました。彼は思いついた。-----------頭を動かす:ここで(hs、ts)= splitAt nは----------私はそれが働きたいと思っています。 – evian1

+2

どのように動作させたいですか? – Carsten

答えて

1

おそらくもっと基本的なアプローチは、

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

私は彼がちょうどこれをコピーして貼り付けて、ここに水平にする必要がある別の問題に戻ってくると確信しています... [OH WAIT](https://stackoverflow.com/questions/36499786/haskell -moving-image-on-horizo​​ntal-line)である。 –

+0

あなたが正しい時にあなたは正しいです。 – karakfa

2

モジュロ演算子がないため友だちのコードが機能しません。回転が「ラッピング」されていないためです。 Carstenのコードは動作します(コードは自身でリストを積み重ねてから適切なスライスを取ることで動作します;積み重ねられているため "wrap"します)。ここに別の方法があります。これはちょうどthe array rotation problemです。

import Data.List (splitAt) 
    import Data.Tuple (swap) 



    rotate :: Int -> [a] -> [a] 

    rotate k xs = uncurry (++) $ swap $ splitAt (k `mod` length xs) xs 

は、我々は2つの半分にリストを分割 - と我々 mod回転、 swapバックのフロントを有効にし、一緒にそれらを追加するためです。 swapはタプルで動作します( splitAtが返す)。 uncurryはリスト連結( ++)が2つの別々の引数ではなくタプルで動作するようにします。タイプ a -> b -> cのファンクションをタイプ (a, b) -> cに変換します。

ここでいくつかのテストがあります。forM_は、for-loopのように、各行を順番に印刷するように使用されています。

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/Downデータ型を作成することができますしたい場合は

Up is positive 
    " X " 
    "XX XX" 
    "XX XX" 
    Down is negative 
    "XX XX" 
    "XX XX" 
    " X " 

。例えば

data Direction = Up | Down 
    rotate :: Direction -> Int -> [String] -> [String] 
    rotate d k xs = . . . 
関連する問題