1
私はクラスのためにハスケルを使ってテトリスゲームを作ろうとしています。いくつかのハスケルのエラー私は理解できないようです
今、私は与えられた入力からボードをプリントアウトすることを実装しようとしています。
私はいくつかのエラーに遭遇しました。私は私の教授が与えた例をオフにしています。それはやや似ています。
私は何をしようとしている
assign3.hs:20:5: error:
The type signature for ‘leftToRight’ lacks an accompanying binding
|
20 | leftToRight :: Int -> Board -> String -> [Char] |
^^^^^^^^^^^
私のコード
module Main where
import Text.Printf (printf)
import Test.HUnit
import Data.Set (empty,member,delete,insert,Set)
main = do
input <- getContents
putStr $ show $ readFrom input
class Disp a where
disp :: a -> String
data Square = Empty deriving (Show, Read, Eq)
instance Disp Square where
disp Empty = " "
type BoardCell = (Square,Int)
type Board = [BoardCell]
data Game = Game Board Int
instance Show Game where
show(Game board width)=
printBoard width board $ lefToRight width board
leftToRight :: Int -> Board -> String -> String
lefToRight width [] = ""
lefToRight width board = (lefToRight width $ drop width board) ++ ("|" ++ formatRow $ take width board ++ "|\n")
rowBreak :: a -> String
rowBreak row =
foldr (\x -> \y -> "-" ++ y) "+\n" row
formatRow :: Board -> String
formatRow row =
foldr (\x -> \y -> "" ++ row1 x ++ y) "" row
row1 :: BoardCell -> String
row1 (square,int) = disp square
printBoard :: Int -> Board -> String -> String
printBoard width [] string = string ++ rowBreak(replicate width 0)
printBoard width [(_,_)] string = printBoard width [] string
printBoard width (_:rest) string = printBoard width rest string
emptyBoard = Game [] 1
readFrom = foldr doLine emptyBoard . lines
doLine game = doCommand game . words
doCommand :: Game -> [String] -> Game
doCommand (Game _ width) ["board",cols,rows] =
Game (take (int rows*width) $ zip (cycle [Empty]) (iterate succ 1))
width
where width = int cols
int :: String -> Int
int = read
は "ボード7 4" のような入力を取ると、この
| |
| |
| |
| |
+-------+
すべてに型署名を付ける必要があります。 'printBoard'、' readrom'、 'doLine'、' rowBreak'です。私はあなたがエラーを見つけるのを助けるだろうと思う。 – luqui
GHCは適切な署名がないと、実際に何をしようとしているのかを知ることができず、推論された型を関数に代入し、間違ってしまう可能性があり、型エラーを完全に細かいコードの途中で他の場所に表示します。また、警告をオンにすることをお勧めします。 – chi
コードを更新し、タイプシグネチャを追加しました。私が得ていたすべてのエラーの問題を解決しました。今これを取得する私は確信していません –