週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Haskellの型クラスは一瞬Javaのインターフェスのように見えてしまいますが、全く異なります。異なる型について同じ操作が出来る、という点では似ていますが、その一方Haskellでは[1.23, 0::Int, 3.14]::List[Num a]みたいなリストは出来ません。

しかし型クラスとは強力なもので、インターフェスの代理のようなものならいくらでも作れます。実際に何がしたいかによりますが。 たとえば、IntとFloatの混合リストくらいならこのとおり。

data Numeric = Numeric {inc :: Numeric, str :: String}
instance Show Numeric where
        show = str

class NumericType a where
        toNumeric :: a -> Numeric

instance Num a => NumericType a where
        toNumeric n = Numeric {
                        inc = toNumeric (n+1),
                        str = show n
                        }

main :: IO ()
main = do
        let intList :: [Int]
            intList = [3..6]
        let floatList :: [Float]
            floatList = [1.2 .. 5]
        let firstList::[Numeric]
            firstList = (map toNumeric intList) ++ (map toNumeric floatList)
        let looper :: [Numeric] -> IO ()
            looper xs = do
                print xs
                looper $ map inc xs
        looper firstList
実行結果
[3,4,5,6,1.2,2.2,3.2,4.2,5.2]
[4,5,6,7,2.2,3.2,4.2,5.2,6.2]
[5,6,7,8,3.2,4.2,5.2,6.2,7.2]
[6,7,8,9,4.2,5.2,6.2,7.2,8.2]
[7,8,9,10,5.2,6.2,7.2,8.2,9.2]
[8,9,10,11,6.2,7.2,8.2,9.2,10.2]
[9,10,11,12,7.2,8.2,9.2,10.2,11.2]
[10,11,12,13,8.2,9.2,10.2,11.2,12.2]
[11,12,13,14,9.2,10.2,11.2,12.2,13.2]
[12,13,14,15,10.2,11.2,12.2,13.2,14.2]
[13,14,15,16,11.2,12.2,13.2,14.2,15.2]
(ry
このくらいなら余裕です。ただしhugsは-98オプションが、ghcでは -fglasgow-exts -fallow-undecidable-instance オプションが必要です。 拡張オプションなしだとinstanceのところでコンパイルエラーします。

こんなどうでもいいことを書いていたら巨大掲示板HaskellスレッドでExistentially quantified typesを解説している人がいてびっくり。ghcのマニュアルに書いてあったとは。参考にさせていただきます>どなたか

スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/64-0b7ef2aa
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。