Sto cercando di implementare la lingua di Little Quilt di Ravi Sethi in Haskell. Una panoramica della piccola trapunta di Sethi può essere visto qui: http://poj.org/problem?id=3201Ravi Sethi's Little Quilt Language in Haskell
Qui ci sono le funzioni che ho finora:
import Data.List.Split
rotate :: Int -> [a] -> [a]
rotate n xs = iterate rot xs !! n
where
rot xs = last xs : init xs
turn :: [a] -> [a]
turn x = rotate 2 x
grid :: Int -> [String] -> String
grid n = unlines . map concat . chunksOf n
printAtom :: [String] -> IO()
printAtom x = putStrLn $ grid 2 x
ho implementato rotate
da utilizzare nella mia funzione turn
, mentre ruota semplicemente un elenco n
volte a sinistra.
Ecco un esempio atomo:
let a0 = ["#", "@", "#", "#"]
Per illustrare come gli atomi sono visti, userò la funzione printAtom:
printAtom a0
#@
##
Quando chiamo turn
su atomo a0
, e stampare il risultante atomo, finisco con il seguente (turn
dovrebbe rappresentare una svolta in senso orario di 90 gradi per l'intero atomo):
che è l'uscita prevista per il primo turno. Questo corrisponderebbe all'atomo orientato a1
. Una svolta su atomo a1
dovrebbe produrre:
@#
##
Tuttavia, dati i vincoli della funzione turn
, restituisce semplicemente l'atomo allo stato a0
. Per combattere questo, ho cercato di implementare una funzione, newTurn
, che utilizza guardie sulla base di un test utilizzando chunksOf 2 atom
, mostrato qui:
newTurn :: [a] -> [a]
newTurn x
| chunksOf 2 x == [["#", "@"], ["#", "#"]] = rotate 2 x
| chunksOf 2 x == [["#", "#"], ["#", "@"]] = rotate 1 x
| chunksOf 2 x == [["@", "#"], ["#", "#"]] = rotate 2 x
| chunksOf 2 x == [["#", "#"], ["@", "#"]] = rotate 1 x
Sono quasi positivo non sto capire come utilizzare le guardie, e mi Sicuramente so che non capisco perfettamente i vincoli di tipo posti sulla definizione di una funzione. Quando provo ad importare la funzione newTurn
in ghci, sto ottenendo questo errore:
functions.hs:19:29:
Couldn't match type `a' with `[Char]'
`a' is a rigid type variable bound by
the type signature for newTurn :: [a] -> [a] at functions.hs:18:1
In the expression: "#"
In the expression: ["#", "@"]
In the second argument of `(==)', namely `[["#", "@"], ["#", "#"]]'
Dopo questa spiegazione prolisso del mio problema, in sostanza quello che ho bisogno di sapere è come ho potuto cambiare la mia funzione di turn
rappresenta un vero giro di 90 gradi in senso orario di un atomo? (Nota: questo è il primo progetto che ho cercato di affrontare in Haskell, quindi sono sicuro che il mio codice è piuttosto disordinato.)
Non riesco a definire la svolta come una funzione. Se dico 'lascia girare = mappa indietro. trasporre' ed eseguire ': t turn' mi dà' turn :: [[a]] -> [[a]] '. Quando lo uso come firma del tipo di 'turn' in un file di definizione di funzione, ottengo il seguente errore:' Impossibile trovare il tipo previsto [[a]] con il tipo effettivo a0 -> c0' – mrg1023
Non riesco a diagnosticare esattamente senza vedere il codice, ma quel messaggio sembra come se da qualche parte si passasse una funzione a 'turn'. Qualcosa come "turn turn" o qualsiasi altra cosa. Puoi postare la parte problematica esatta da qualche parte? –
Seguendo il tuo suggerimento, 'turn = map reverse. transpose', che funziona quando viene passato un elenco di liste nell'interprete. Ecco come ho provato a definirlo come una funzione: 'turn :: [[a]] -> [[a]] turn xs = map reverse xs. trasporre xs'. Questo mi dà l'errore di tipo, come mostrato nel mio commento precedente. – mrg1023