2016-11-29 14 views
3

私は2つの整数値mとnを取る関数を定義しようとしています。これは、長方形として表示できる値を返します。私のコードでHaskell - 文字列(サイズn)のリスト(サイズn)を生成しようとしています

e.g. rectangle 3 4 
**** 
**** 
**** 

、私は私が間違った型[シャア]を持っていると言って構文エラーを取得していますが、私はどこにも文字を使用していませんよ。

コード:

rectangle :: Int -> Int -> [String] 
rectangle m n = generateRectangle m n [] 

generateRectangle :: Int -> Int -> [String] -> [String] 
generateRectangle m n currentRectangle = 
    if length currentRectangle < n then 
     generateRectangle m n (addRow m ""):currentRectangle 
    else 
     currentRectangle 

addRow :: Int -> String -> String 
addRow size currentRow = 
    if length currentRow < size then 
     addRow size currentRow++"*" 
    else 
     currentRow 

エラー:

ERROR file:test.hs:8 - Type error in application 
*** Expression  : generateRectangle m n (addRow m "") 
*** Term   : addRow m "" 
*** Type   : [Char] 
*** Does not match : [String] 
+2

'String'は' [Char] 'のエイリアスです.Hugsのような放棄コンパイラを使用しているときは、エラーメッセージが表示されない可能性があります。まだ維持されているので、Hugsを使ってGHCを使うことを強く主張します。 – bheklilr

+0

@bheklilr私はそれを試してみます、提案のおかげで。私はこれが私たちの講師がみんなに使うように提案したものなので、これを使用しています。 –

+2

ghciをチェックアウトすることをお勧めします。これはGHCのインタラクティブなコンポーネントで、Hugsのプロンプトによく似ています(それでも読んでも全く同じように動作しません)。あなたの講師がコードを提出したいと思っていて、GHCで動作するように書いたのであれば、Hugsがサポートしていないものを誤って使用した場合、Hugsで動作しない可能性があります。 –

答えて

4

あなたaddRow戻りString[Char]です。しかし、あなたのgenerateRectangle[[Char]]ある[String]を、期待し:

generateRectangle m n (addRow m "") : currentRectangle 
          ^^^^^^^^^^^^^ 
          this is a String, not a [String] 

(generateRectangle m n (addRow m "")) : currentRectangle 

と同じだと型が一致しないこと。

あなたは、おそらく代わりに、このことを意味:

generateRectangle m n ((addRow m "") : currentRectangle) 

は関数適用が最も高い優先度を持ち、覚えておいてください。言われていること


、機能の代わりに

repeatNTimes :: Int -> a -> [a] 

を書いてみます。その後、あなたはその関数を2回使用してrectangleを書き込むことができます。

rectangle n m = repeatNTimes ??? (repeatNTimes ??? ???) 

たぶん、あなたもrepeatNTimesのような役割を果たし機能を知っているが、あなた自身の最初にそれを把握してみてください。

+0

ありがとう!これは構文エラーを取り除いたものです。間違いなくあなたの提案を見ていきます。 –

+3

@Toby注意してください!あなたのエラーは構文的なものではありません。これは型エラーです。つまり、あなたの構文はうまくいきましたが、あなたのタイプはそうではありませんでした。たとえば '(2 :: Double)+(3 :: Int)'は構文上問題ありませんが、 '(+)'は両方の引数が同じ型を使用する場合にのみ機能します。両方とも通訳でお試しください。ニトピキニ、しかし重要です。 – Zeta

関連する問題