2017-12-07 7 views
-2

最初のヘルプのThx。今私はこれを変更しました。それでもボグエラー。私のコード全体が間違っているか、平日の機能を持つ部分だけですか? 別の関数内の関数をどのように呼び出すことができますか?平日のハスケルグレゴリアンカレンダー式

data Wochentag = Mo | Di | Mi | Do | Fr | Sa | So 
deriving (Eq, Ord, Show, Enum) 

data Month = Jan | Feb | März | April | Mai | Juni | Juli | Aug | Sep | Okt | Nov | Dec 
deriving (Eq, Ord, Show, Enum) 


weekday :: Integer -> Month -> Integer -> Wochentag 
weekday day month year = weekdays day (zahlmonth month) year 

y1 = year - (14 - zahlmonth) /12 
x = y1 + (y1 /4) - (y1 /100) + (y1 /400) 
m = zahlmonth + 12 * ((14- zahlmonth) /12) -2 


weekdays day zahlmonth year 
    | mod (day + x + ((31*m)/12)) 7 == 0 = So 
    | mod (day + x + ((31*m)/12)) 7 == 1 = Mo 
    | mod (day + x + ((31*m)/12)) 7 == 2 = Di 
    | mod (day + x + ((31*m)/12)) 7 == 3 = Mi 
    | mod (day + x + ((31*m)/12)) 7 == 4 = Do 
    | mod (day + x + ((31*m)/12)) 7 == 5 = Fr 
    | mod (day + x + ((31*m)/12)) 7 == 6 = Sa 
    | otherwise = error "kein Tag" 



zahlmonth :: Month -> Integer 
zahlmonth month = case month of 
    Jan -> 1 
    Feb -> 2 
    März -> 3 
    April -> 4 
    Mai -> 5 
    Juni -> 6 
    Juli -> 7 
    Aug -> 8 
    Sep -> 9 
    Okt -> 10 
    Nov -> 11 
    Dec -> 12 

エラーログは次のとおりです。

Couldn't match expected type `Month -> Integer' 
        with actual type `Integer' 
    * In the first argument of `weekdays', namely `day' 
     In the expression: weekdays day (zahlmonth month) year 
     In an equation for `weekday': 
      weekday day month year = weekdays day (zahlmonth month) year 
    | 
95 | weekday day month year = weekdays day (zahlmonth month) year 
    |         ^^^ 

    Variable not in scope: year :: Month -> Integer 
    | 
97 | y1 = year - (14 - zahlmonth) /12 
    |  ^^^^ 

全く奇妙なそれを修正する方法は考えています。平日に説明をすると、それはさらに悪化する。

+0

あなたは、あなたの意図を宣言するために、常にタイプ注釈を提供することによって機能を開始するべきです。さもなければ、GHCはあなたの関数の型を推論しますが、型エラーの場合、GHCはそれが推測したものと意図した型を比較す​​ることはできません。 – chi

+0

私は今編集しました –

+0

これらのy1、x、m平均は何ですか?そして 'year 'はどこに定義されていますか? –

答えて

0

ここで問題となるのは、すべてのトップレベルバインディングのタイプを追加していないことです。そのうちのいくつかは間違ったタイプに推論されています。型注釈だけがあった場合、GHCはエラーを直ちに報告していましたが、GHCには、推測された型が間違っていることが分かりません。

後で間違ったタイプが問題を引き起こし、GHCだけが無関係のコードで問題を報告します。詳細に

よりは、ここに何が起こるかです:ここで

m = zahlmonth + ... 

zahlmonth機能Month -> Integerです。 +の結果タイプは引数と同じであるため、mも関数Month -> Integerです。

ありました。m :: Integerが存在していた場合、GHCはここでエラーで停止します。しかし、悲しいかな、GHCはこれが問題であることを知ることはできません。

はその後、同じタイプの操作+,*,/仕事以来

weekdays day zahlmonth year 
    | mod (day + x + ((31*m)/12)) 7 == 0 = So 

は、我々は dayxmの同じタイプ、つまりMonth -> Integerを持っていることを取得します。

weekdaysにタイプシグネチャがある場合、GHCはエラーに気付くでしょうが、それがうまくいっています。最後に

、ここで weekday

weekday day month year = weekdays day (zahlmonth month) year 

day :: Integerことを言って、署名を持っています。しかし、我々はweekdaysday :: Month -> Integerを予期していると推測しました。これはタイプエラーを引き起こします

これは推論の間に上で何が起こっているのかを理解した後にはっきりしています。

しかし、推論の間に起こっていることを理解するのは簡単ではありません!一般的に、プログラムの周りのタイプの自動推論では、GHCに従うのは非常に難しいです。幸いにも、これは必要ありません。コードを慎重に書いて、型のエラーを可能な限り早く捕らえることができるように、型をバインディングに注釈を付けることが必要です。