私はGHCiのを使用して、数値強制をテストした:Num型のクラス強制によるインスタンスは、どのようにFractionalに暗黙的にできますか?
>> let c = 1 :: Integer
>> 1/2
0.5
>> c/2
<interactive>:15:1: error:
• No instance for (Fractional Integer) arising from a use of ‘/’
• In the expression: c/2
In an equation for ‘it’: it = c/2
>> :t (/)
(/) :: Fractional a => a -> a -> a -- (/) needs Fractional type
>> (fromInteger c)/2
0.5
>>:t fromInteger
fromInteger :: Num a => Integer -> a -- Just convert the Integer to Num not to Fractional
を私はテンキー(fromIntegerはタイプfromInteger :: Num a => Integer -> a
を持っている)に整数型に変換するfromInteger
機能を使用することができますが、私はどのようにタイプNum
を変換することができることを理解することはできません暗黙的にFractional
に?インスタンスがNum
型を持つ場合、それがFractional
タイプのインスタンスとして使用することができることを
は、私は、インスタンスがFractional
型を持つ場合、それはタイプNum
(class Num a => Fractional a where
)を持っている必要があることを知っているが、それは必要なのでしょうか?
@mnoronhaご返信ありがとうございました。 1つの質問だけが私を混乱させます。私はtype a
が機能で使用できない理由を知っています(/)
はtype a
がtype Integer
であり、type class Fractional
のインスタンスではありません(引数のタイプはinstance of Fractional
でなければなりません)。私が理解できないことは、型整数をNum
のインスタンスになるa
型に変換する場合でも、a
型がFractional
のインスタンスになることを意味しないということです(分数型のクラスはNum型のクラスよりも制約が強いためので、a
タイプは、Fractional type class
で必要な機能を実装していない可能性があります)。 a
タイプが条件Fractional type class
が必要とするものに完全に適合しない場合、引数タイプをFractionalのインスタンスにするように、関数(/)
でどのように使用できますか?母国語でない人には申し訳ありません。本当にありがとうございます。
私はタイプが唯一の親型クラスに合うならば、それはより制約型クラスを必要とする関数では使用できないことをテストしました。
{-# LANGUAGE OverloadedStrings #-}
module Main where
class ParentAPI a where
printPar :: int -> a -> String
class (ParentAPI a) => SubAPI a where
printSub :: a -> String
data ParentDT = ParentDT Int
instance ParentAPI ParentDT where
printPar i p = "par"
testF :: (SubAPI a) => a -> String
testF a = printSub a
main = do
let m = testF $ ParentDT 10000
return()
====
test-typeclass.hs:19:11: error:
• No instance for (SubAPI ParentDT) arising from a use of ‘testF’
• In the expression: testF $ ParentDT 10000
In an equation for ‘m’: m = testF $ ParentDT 10000
In the expression:
do { let m = testF $ ParentDT 10000;
return() }
私は非常に明確に数値オーバーロードのあいまいさを説明するドキュメントを発見したと同じ混乱で他人を助けるかもしれません。
https://www.haskell.org/tutorial/numbers.html
Num a => aで制約されているが、Fractional型のクラスに制約されていない型変数 'a'。変数 'a'は'(/) 'のようないくつかの振る舞いを実装していないかもしれませんか?たとえば、分数動作が '(/)'を実装していない場合、 '(/)'関数で 'a'をどのように使うことができますか? – hliu
'Fractional a => a 'で制約された型変数は、' Num'クラスで定義されたすべての動作を実装できます。 'Fractional a => a'をより厳格な制約として考えることができるので、同じことは逆には当てはまりません - 許容可能な' a'型は部分集合です。 – mnoronha
詳細な返信をありがとうございます。質問は1つだけですが、ここではあまりにも長く、生の質問の後に投稿します。 – hliu