2

ここからのコードの下でタイプ関数を楽しんでください

{-# 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'

お気づきかもしれませんが、私は立ち往生しているので、どんな助けも私にとって貴重です。:)

4

1 に答える 1

5

問題は、Add使用するインスタンスを決定するための十分なコンテキストがないため、結果のタイプを決定できないことです。ghcは使用するタイプを認識していないため、最も一般的な問題を報告しShowます。一般的なインスタンスはありませんSumTy a b

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)

ただし、提案された「可能な修正」は、ここで必要なものではありません。必要なのは、引数のタイプを指定してadd、使用するインスタンスを決定できるようにすることです。これにより、結果のタイプを決定できます。

*TyFun> show (add (1 :: Int) (1 :: Int))
"2"
*TyFun> show (add (1 :: Integer) (1 :: Integer))
"2"
*TyFun> show (add (1 :: Integer) (1 :: Double))
"2.0"
*TyFun> show (add (1 :: Integer) (1 :: Float))

<interactive>:7:1:
    No instance for (Show (SumTy Integer Float))
      arising from a use of `show'
    Possible fix:
      add an instance declaration for (Show (SumTy Integer Float))
    In the expression: show (add (1 :: Integer) (1 :: Float))
    In an equation for `it':
        it = show (add (1 :: Integer) (1 :: Float))

<interactive>:7:7:
    No instance for (Add Integer Float) arising from a use of `add'
    Possible fix: add an instance declaration for (Add Integer Float)
    In the first argument of `show', namely
      `(add (1 :: Integer) (1 :: Float))'
    In the expression: show (add (1 :: Integer) (1 :: Float))
    In an equation for `it':
        it = show (add (1 :: Integer) (1 :: Float))
于 2013-01-22T23:05:03.137 に答える