toFloat
はFloating
タイプキャストに属するタイプを返すことができますが、それはFloat
に限定されていますが間違っています。あなたの関数はa
のポリモーフィックなので、Floating
のインスタンスを返すことはできません。すべてのインスタンスで動作するはずです。
OtherwayあなたはでそれがFloating
を型クラスに属するタイプを返しますので、あなたは(Floating
に属する)任意の型に変換することができるはずGHCiの
*Main> :t toFloat "12.1"
toFloat "12.1" :: (Floating a, Read a) => a
*Main> :t (toFloat "12.1" :: Float)
(toFloat "12.1" :: Float) :: Float
*Main> :t (toFloat "12.1" :: Double)
(toFloat "12.1" :: Double) :: Double
で
toFloat :: (Read a,Floating a) => String -> a
toFloat s = read s
ことで、これを理解することができます関数が適用された後に明示的な型シグネチャを提供する。 一方、Float
を明示的に返すときは、この関数からDouble
を期待しているとは言えません。
あなたの仮定が今ここに機能read
read :: Read a => String -> a
を考えるあなたに応じて、あなただけのInt
がRead
のインスタンスを持っているので、すべてのためにInt
を言う返すことができているか恐ろしい。理解する別の方法今あなたが
read "12" + (1.2 :: Double)
クイック応答ありがとう。これは私の問題を完全に明確にします。どういうわけか、私の関数の呼び出し元が私のtypeclassの特定のインスタンスを要求できるということは私をクリックしませんでした。 – nottombrown