2013-06-28 9 views
5

私はまだハズケルに入ることを非常に試みていますが、私はかなり気になるものに気づきました。なぜshowはhaskellの変換として扱われませんか?

"Learn You a Haskell for Great Good!"本の中には、パターンマッチングでガードを使用している部分があります。本の場合、人のbmiを計算する小さな関数であり、このような少し変化しましたわずかではないに著作権または何でも)侵害:すべての罰金です

bmiCalc :: (RealFloat a) => a -> a -> String 
bmiCalc weight height 
    | bmi <= 18.5 = "skinny" 
    | bmi <= 25.0 = "normal" 
    | bmi <= 30.0 = "fat" 
    | otherwise = "obese" 
    where bmi = weight/height^2 

をして宣伝としてコードが動作ダンディ、私はそれはまた、それが計算BMIに沿ったテキストであったものを示した場合はどう、と思いましたか?

bmiCalc :: (RealFloat a) => a -> a -> String 
bmiCalc weight height 
    | bmi <= 18.5 = "skinny, " ++ show bmi 
    | bmi <= 25.0 = "normal, " ++ show bmi 
    | bmi <= 30.0 = "fat, " ++ show bmi 
    | otherwise = "obese, " ++ show bmi 
    where bmi = weight/height^2 

.toStringが
少年は私が間違っていたJavaとC#でするように動作するように「ショー」を期待:

は、だから私は、これにコードを再書きました。その理由がある

Could not deduce (Show a) arising from a use of `show' 
from the context (RealFloat a) 
    bound by the type signature for 
      bmiCalc :: RealFloat a => a -> a -> String 
    at file.hs:1:16-48 
Possible fix: 
    add (Show a) to the context of 
    the type signature for bmiCalc :: RealFloat a => a -> a -> String 
In the second argument of `(++)', namely `show bmi' 
In the expression: "skinny, " ++ show bmi 
In an equation for `bmiCalc': 
    bmiCalc weight height 
     | bmi <= 18.5 = "skinny, " ++ show bmi 
     | bmi <= 25.0 = "normal, " ++ show bmi 
     | bmi <= 30.0 = "fat, " ++ show bmi 
     | otherwise = "obese, " ++ show bmi 
     where 
      bmi = weight/height^2 
Failed, modules loaded: none. 

GHCiのは私にこの大きな厄介なエラーメッセージを与えましたか?文字列を返すように見えるものを文字列に追加することができないのはなぜですか?私が理解している限りでは"skinny, " ++ show bmiは文字列です...タイプシグネチャが返さなければならないと言うものです

ここで何が間違っていますか?

+1

「可能な修正」の直後にエラーメッセージからの提案を試しましたか? – Yuras

+2

相当するJava同等のものは、 'show'が' Show'インターフェースのメソッドであり、値 'a'はそのインターフェースを実装する必要はないので、コンパイル時の型チェックエラーがあります。 Javaで起こったのと同じことです。 –

+0

これは、 'RealFloat'型の' RealFloat'が( 'Num'を介して)前提条件の1つとして' Show'を持つケースでしたが、これはずっと前に変更されました。 LYAHはこの点で古くなっています(http://learnyouahaskell.com/types-and-typeclasses#typeclasses-101を参照し、「Numに参加する」を検索してください) – yatima2975

答えて

9

変更型シグネチャへ:

bmiCalc :: (RealFloat a, Show a) => a -> a -> String 

あなたはShow型クラスから、メンバ関数showを使用したいので。関数の制約でそれを指定していないので、ghciはそれが正しいと推論する方法がありません。

+0

面白いのは、これを前にやってみました。それは動作しませんでした...それは今どういうわけか..とにかく感謝! –

+5

このようなエラーが発生したときに最も簡単な方法は、型シグネチャを削除し、ghciでファイルをリロードし、 ':t bmiCalc'と入力することです。それが最後にすべてのタイプシグネチャを追加する方法です。 – mhitza

+0

すてきなチップありがとう! –

2

RealFloatは表示可能なタイプではありません。あなたはショーの制約を追加する必要があります。

関連する問題