0

私はhaskellでうまくコンパイルできる関数を持っています。

次のようになります。

suffix :: Int -> String
suffix i 
   | i==0                 = "th"
   | i==1                 = "st"
   | i==2                 = "nd"
   | i==3                 = "rd"
   | i>=4 || i<=9         = "th"
   | i<0                  = error "Must be positive integer"     ----------NOT WORKING?
   | otherwise            = suffix(i `rem` 10)      

少なくとも警備員のエラーラインではわかりませんi<0。GHCIに入り、数字に「-」を追加すると、suffix -5このケースを完全に省略した場合と同じエラーメッセージが表示されます。

エラーメッセージをはっきりと表示したいのですが。うまくいけば、誰かが私の問題を見つけることができます。ありがとう!

4

3 に答える 3

9

基本的な Haskell 構文の奇妙さ。これは、この言語で唯一のケースです。

suffix -5ははsuffix - 5です(-) suffix 5。haskellの-すべての句読点で名前が付けられた関数と同様に、文字は中置二項演算子として扱われます。つまり、. の前の式に文字がない場合を除き-ます。必要なことを行う最も簡単な方法は、 を使用することですsuffix (-5)。括弧で囲むことにより、構文的に独立-した式になります。つまり、式の前に文字がありません。

ただし、これは、入力から値を減算するための演算子セクションを作成できないという点で、独自の奇妙さを生み出します。 言語の他の二項演算子とは異なり、(-5)を意味するセクションではありません。\x -> x - 5単項否定と 2 項減算が同じ記号を使用するのは、ちょっと残念な状況です。Haskell の構文では、このようなコーナー ケースが必要になるからです。

于 2013-02-13T01:56:46.877 に答える
3

これを書くsuffix -5と、「サフィックスから 5 を引く」と解釈されます。つまり、二項演算子-を引数suffixandに適用しようとしていると見なされます5。もちろん、関数から数値を減算することはできないため、これは機能しません。

と書けばうまくいきますsuffix (-5)

于 2013-02-13T01:56:36.700 に答える
0

Haskellのガードは上から下に一致します。i < 0条件が一致することはありません。iゼロ未満の場合は、最初にそのi >= 4 || i <= 9上の条件に一致するためです。

于 2013-02-14T05:40:37.637 に答える