2017-06-06 12 views
0

関数の型の定義に問題があります。 1,10,11,12の場合、Intを挿入してfloatを返しますが、Intを挿入してIntを返す場合、型が一致しません。 私は(私は積分と小数は実数の内側にあるので、この1つは働くだろうと思った)function-intの型を定義し、浮動小数点型を使用するhaskell

pointsForSeventy 1 = 5.5 
pointsForSeventy 10 = 0.5 
pointsForSeventy 11 = 0.5 
pointsForSeventy 12 = 0.5 
pointsForSeventy a = a 

> pointsForSeventy :: INT-> pointsForSeventyでもフロートと::実A-> INT-てみましたあなたが明示的な変換必要事前

+0

あなたの2番目の考え方は構文的に壊れており、 'Int'から' a'までの関数である 'pointsForSeventy :: Real a => Int - > a 'でなければなりません。' a'は 'Real '。制約の後に太い矢印があることに気付く( '=>' not ' - >')。 –

答えて

3

のおかげで:いくつかの他のプログラミング言語とは異なり

pointsForSeventy 1 = 5.5 
pointsForSeventy 10 = 0.5 
pointsForSeventy 11 = 0.5 
pointsForSeventy 12 = 0.5 
pointsForSeventy a = fromIntegral a 

は、Haskellは自動的に数値型間の自動または暗黙的な変換を実行することはありません。

一方、数字のリテラルは、任意の数値タイプに属します。例えば。 1/2*0.5 :: Double0.25を返します.3つのリテラルはすべてDoubleです。代わりにCのような言語では1/2*0.50となるので、1/2は整数除算(!)であり、0と評価されます。

+0

あなたの答えをありがとう、問題点は私がこのように明確にする必要があるということです。pointsForSeventy :: - > – cde33

+1

@ cde33 'pointsForSeventy :: Double - > Double'または入力と出力の両方に同じ浮動小数点型を使用する同様のものです。 – chi

4

Haskellは静的型付き言語です。つまり、戻り値のタイプはではなく、入力のに依存します。ではありません。

アイデアはfromIntegral :: (Integral a, Num b) => a -> bを使用してFloatIntを変換するために、次のようになります。

pointsForSeventy :: Int -> Float 
pointsForSeventy 1 = 5.5 
pointsForSeventy 10 = 0.5 
pointsForSeventy 11 = 0.5 
pointsForSeventy 12 = 0.5 
pointsForSeventy a = fromIntegral a

あなたはFloat場合とは異なりIntケースを扱いたい場合は、あなたもEither使用することができます。

pointsForSeventy :: Int -> Either Float Int 
pointsForSeventy 1 = Left 5.5 
pointsForSeventy 10 = Left 0.5 
pointsForSeventy 11 = Left 0.5 
pointsForSeventy 12 = Left 0.5 
pointsForSeventy a = Right a
関連する問題