8

私は基本的に、Haskell 内で ORM フレームワークをエミュレートできるかどうかを確認しようとしています。そのため、ユーザーがデータベース モデルを作成したい場合は、次のようにします。

data Car = Car {
        company :: String, 
        model :: String, 
        year :: Int
        } deriving (Model)

テーブルは「車」で、列は会社、モデル、年になります

Haskell 内でこれを行うには、クラスとジェネリックを組み合わせて使用​​する必要があります。このチュートリアル(http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/generic-programming.html)を使用して、これを思いつきました(これは基本的にコピーして名前を変更しただけなので、取得できますコードの動作)

{-# LANGUAGE DeriveGeneric, TypeOperators, TypeSynonymInstances, FlexibleInstances #-}

module Main where
import GHC.Generics

class SModel b where
        s_new :: b -> IO()

instance SModel Int where
        s_new s = putStrLn s++":Int"

instance SModel Integer where
        s_new s = putStrLn s++":Integer"

instance SModel String where
        s_new s = putStrLn s++":String"    

class Model m where
        new :: m a -> IO()

instance Model U1 where
        new U1 = putStrLn "unit"

instance (Model a, Model b) => Model (a :*: b) where
        new (a :*: b) = do
                new a
                new b

instance (Model a, Model b) => Model (a :+: b) where
        new (L1 x) = new x
        new (R1 x) = new x

instance (Model a) => Model (M1 i c a) where
        new (M1 x) = new x

instance (SModel a) => Model (K1 i a) where
        new (K1 x) = s_new x

data Car = Car {
        company :: String, 
        model :: String, 
        year :: Int
        } deriving (Model)

上記のコードはエラーを生成します

Cannot derive well-kinded instance of form `Model (Car ...)'
      Class `Model' expects an argument of kind `* -> *'
    In the data declaration for `Car'

そして、私はこの時点でちょっと立ち往生しています.レコードをカバーするために必要なジェネリック型のすべてをすでにインスタンス化していると思います.

4

1 に答える 1