0

次のコードはコンパイルを拒否します。Haskell を使って 1.5 週間になります。だからただの初心者。

                       name = (mod ( tag + x + (div ( 31 * m )  12 )) 7 )  

入力 "=" で解析エラーが発生しました。次の行に関するものです。

name = (mod ( tag + x + (div ( 31 * m ) 12 )) 7 )

その行で何が間違っているのかわかりません。私は他の言語で作業してきましたが、Haskell は特定のものです。

4

2 に答える 2

1

あなたが何を望んでいるのかわかりませんが、それは単なる構文エラーです。等価性をチェックしたいかもしれません (==代わりに を使用します=)。Boolしかし、そうではない可能性があります。なぜなら、戻り値の型はではなくであるべきだからStringです。weekdayまた、関数のすべての引数がその定義で使用されているわけではないため、この例は奇妙に見えます。

アップデート

あなたのコードは次のようになるはずです:

weekday :: Int -> Int -> Int -> String
weekday jahr monat tag =
  let name = (mod ( tag + x + (div ( 31 * m )  12 )) 7 )
  in
    case name of
    0 -> "Sonntag"
    1 -> "Montag"
    2 -> "Dienstag" 
    3 -> "Mittwoch"
    4 -> "Donnerstag"
    5 -> "Freitag"
    6 -> "Samstag"
  where                        
    y = jahr - ( div ( 14 - monat )  12 )   
    x = y + ( div y 4 ) - ( div y 100 ) + ( div y 400 )
    m = monat + (12 * ( div ( 14 - monat ) 12 )) - 2 

それも機能します(結果は確認していませんが):http://ideone.com/YAKXTU

let基本的な Haskell 構成要素およびの意味についてもう少し学ぶ必要がwhereあります。「Learn You a Haskell for Great Good!」という優れた本があります。私がお勧めします。幸運を!

于 2013-10-26T10:10:34.913 に答える
0

バインディングを使用whereして、Haskell で名前を導入できます。

weekday jahr monat tag = <function body>
  where name = (mod ( tag + x + (div ( 31 * m )  12 )) 7 )

つまりwhere、関数の句で変数を定義する必要があります。Learn You a Haskellwhereなどで節について詳しく読むことができます。

2 番目の質問について: Haskell コードでタブを使用できます。Haskell コードでは、「コードのインデントされたブロック」についてはめったに話しません。タブが適している場所です。ほとんどの場合、関数の引数を揃えようとしますが、スペースは揃えるのに適しています。

于 2013-10-26T10:11:03.700 に答える