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'変数の型と関係があると仮定することしかできません。
誰かが初心者を助けることができたら、それは非常に感謝しています。コードに他の問題がある場合(または誤った用語を使用している場合)、私に知らせてください。
ああ、わかります。 'calcBmi ::(RealFloat a、Show b)=> a-> a-> b'をあなたの提案に使うべきではない理由はありますか? – Harry
また、outputBmi ::(RealFloat a)=> a - > a - > Stringを 'outputBmi ::(RealFloat a、Show a)=> a - > a - > String'に変更する必要があったようです。 'calcBmi 'エラーの使用に起因する(Show a)を推論できませんでした。なぜ、何の洞察? – Harry
@ハリー署名(RealFloat a、Show b)=> a-> a-> bは、aは任意の浮動小数点型に選択でき、bは任意の型文字列に変換できます。これにより、ユーザは、例えば、 'Float - > Float - >(Bool、Int)'を全体の型として返します。これは私たちが望むものではありません。また、 'a'型の引数を文字列に変換する必要があるので、' Show a'ではなく 'Showb'という制約が必要です。 – chi