2017-11-14 18 views
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" のような入力を取ると、この

  |  | 
      |  | 
      |  | 
      |  | 
      +-------+ 
+1

すべてに型署名を付ける必要があります。 'printBoard'、' readrom'、 'doLine'、' rowBreak'です。私はあなたがエラーを見つけるのを助けるだろうと思う。 – luqui

+0

GHCは適切な署名がないと、実際に何をしようとしているのかを知ることができず、推論された型を関数に代入し、間違ってしまう可能性があり、型エラーを完全に細かいコードの途中で他の場所に表示します。また、警告をオンにすることをお勧めします。 – chi

+0

コードを更新し、タイプシグネチャを追加しました。私が得ていたすべてのエラーの問題を解決しました。今これを取得する私は確信していません –

答えて

0
のような出力を得ることでエラーが

Daniel Wagnerが質問のコメントで指摘したように、スペルミスがあります。 leftToRightが正しくタイプされたタイプシグネチャで使用されています。 lefToRightが関数定義に使用されていますが、スペルが間違っています。

したがって、タイプシグネチャには、同じ名前の関数定義が含まれていないため、エラーが発生します。

関連する問題