私は Haskell の初心者なので、明らかな何かを見落としている可能性があります...
アドホック ポリモーフィズムを使用して一般的な色の量子化アルゴリズムを作成しようとしています。ただし、パターン マッチングでデータを取得するのに問題があります (実際にはまだ量子化ビットに到達していません)。
これを簡潔に説明することはできないため、問題を示すコードの簡略版を次に示します。
{-# LANGUAGE FlexibleInstances #-}
import Data.Word
type ColourGrey = Word8
data ColourRGB = ColourRGB Word8 Word8 Word8
deriving (Show)
data ColourStream = Greys [ColourGrey]
| Colours [ColourRGB]
deriving (Show)
class Colour a where
extractStreamData :: ColourStream -> [a]
instance Colour ColourGrey where
extractStreamData (Greys x) = x
instance Colour ColourRGB where
extractStreamData (Colours x) = x
someColours = Colours [ColourRGB 255 0 0, ColourRGB 0 255 0, ColourRGB 0 0 255]
someGreys = Greys [0, 127, 255]
main :: IO ()
main = do
print $ extractStreamData someColours
print $ extractStreamData someGreys
呼び出しextractStreamData
は次のように失敗します。
No instance for (Colour a1)
arising from a use of `extractStreamData'
The type variable `a1' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance Colour ColourRGB -- Defined at test.hs:20:10
instance Colour ColourGrey -- Defined at test.hs:17:10
In the second argument of `($)', namely
`extractStreamData someGreys'
In a stmt of a 'do' block: print $ extractStreamData someGreys
In the expression:
do { print $ extractStreamData (someColours :: ColourStream);
print $ extractStreamData someGreys }
これは、Haskell がどのインスタンスを使用するか (カラー用またはグレースケール用) を推測できないことを意味します。それは正しいでしょうか?もしそうなら、どうすればこれを修正できますか?
nbとの定義はColourGrey
、ColourRGB
私の影響範囲外です (それらは外部ライブラリの一部です)。したがって、提案はこれら 2 つのタイプを法とする必要があります。他の多くの場所で使用されているため、私も をいじりたくありませんColourStream
。
「生の」リストにアクセスする必要があるのは、 などを操作できるようにするためmap
です。まだ習得していない反復可能にする巧妙なトリックがある場合はColourStream
、それがうまくいくと思います...</thinking aloud>