ここからのコードの下でタイプ関数を楽しんでください
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, FlexibleContexts, TypeFamilies #-}
-- Start basic
class Add a b where
type SumTy a b
add :: a -> b -> SumTy a b
instance Add Integer Double where
type SumTy Integer Double = Double
add x y = fromIntegral x + y
instance Add Double Integer where
type SumTy Double Integer = Double
add x y = x + fromIntegral y
instance (Num a) => Add a a where
type SumTy a a = a
add x y = x + y
-- End basic
これは私が実行しようとしているコードです:
main = print $ show (add 1 1)
結果は次のとおりです。
No instance for (Show (SumTy a0 b0))
arising from a use of `show'
Possible fix: add an instance declaration for (Show (SumTy a0 b0))
In the second argument of `($)', namely `show (add 1 1)'
In the expression: print $ show (add 1 1)
In an equation for `main': main = print $ show (add 1 1)
私はどこにでも「データ」を置くようないくつかのことを試みました:
結果1
Not a data constructor: `a'
結果2(「instance(Num a)」を削除した後)
Multiple declarations of `Double'
Declared at: ...
関数を追加するようなもの:
class Add a b where
type SumTy a b
add :: a -> b -> SumTy a b
s :: SumTy a b -> String
instance Add Integer Double where
type SumTy Integer Double = Double
add x y = fromIntegral x + y
s (SumTy _ x) = show x
main = print $ show (s (add 1 2.0) )
この結果で:
Not in scope: data constructor `SumTy'
お気づきかもしれませんが、私は立ち往生しているので、どんな助けも私にとって貴重です。:)