2016-05-19 18 views
0

私はHaskellで出始めていますし、次の2つの関数を作成している:ハスケルダブル文字列の連結

calcBmi :: (RealFloat a) => a -> a -> a -- Accepts two and returns one 'RealFloat' number. 
calcBmi w h = w/h^(2 :: Integer) -- Stores argument one and two in w and h respectively and evaluates 

outputBmi :: (RealFloat a) => a -> a -> String -- Accepts two RealFloats and returns string 
outputBmi weight height = let bmi = calcBmi weight height in "Your BMI was calculated to " ++ bmi 

私はこのコードをコンパイルしようとすると、私は次の例外

が一致しませんでし取得を予想されるタイプの第二引数に実際のタイプ '[シャア]' ''

'(++)'、すなわち 'BMI'

エラーが何を意味するのかわかりません。正しくコンパイルするためにコードを修正する方法はありません。私はそれが 'bmi'変数の型と関係があると仮定することしかできません。

誰かが初心者を助けることができたら、それは非常に感謝しています。コードに他の問題がある場合(または誤った用語を使用している場合)、私に知らせてください。

答えて

3

変数は文字列ではないため、(++)関数では使用できません。通常、showを使用して文字列に変換することはできますが、タイプにはShowのインスタンスであることが指定されていないため、これを追加するか、直接型を指定する必要があります(つまり-)例えば

、あなたは

01を以下のように、あなたは文字列を作成することができますcalcBmi

calcBmi :: Float->Float->Float 

または

calcBmi :: (RealFloat a, Show a)=>a->a->a 

の種類を変更することができます

"Your BMI was calculated to " ++ show bmi 
+0

ああ、わかります。 'calcBmi ::(RealFloat a、Show b)=> a-> a-> b'をあなたの提案に使うべきではない理由はありますか? – Harry

+0

また、outputBmi ::(RealFloat a)=> a - > a - > Stringを 'outputBmi ::(RealFloat a、Show a)=> a - > a - > String'に変更する必要があったようです。 'calcBmi 'エラーの使用に起因する(Show a)を推論できませんでした。なぜ、何の洞察? – Harry

+0

@ハリー署名(RealFloat a、Show b)=> a-> a-> bは、aは任意の浮動小数点型に選択でき、bは任意の型文字列に変換できます。これにより、ユーザは、例えば、 'Float - > Float - >(Bool、Int)'を全体の型として返します。これは私たちが望むものではありません。また、 'a'型の引数を文字列に変換する必要があるので、' Show a'ではなく 'Showb'という制約が必要です。 – chi