1

コンパイル時にコンパイル時のキーを実行時の値にマップするマップを作成したいと思います。関数は、これらのキーをチェックし、必要なキーがすべて存在しない場合はコンパイラエラーをスローできる必要があります。

これは大まかに私が達成したいことです:

class HasFirst a
  first :: String

class HasMiddle a
  middle :: String

class HasLast a
  last :: String

print_full_name :: (HasFirst a, HasLast a) => a -> String

addFirst :: String -> a -> b
addFirst s x = -- ( Add a first name to x )

emptyName :: -- some empty name

x1 = addFirst "John" $ addLast "Smith" $ emptyName
x2 = addMiddle "Bob" $ addLast "Smith" $ emptyName

main = putStr $ print_full_name x1 -- Compiles
main = putStr $ print_full_name x2 -- No first name so compile error

C ++の知識がある人のために、私は大まかにboost ::fusion::mapが何をするのかを知りたいです。

上記のコードは必ずしも必要ではありません。コンパイル時にパラメーターを確認できることが重要です。メカニズムがクラスであろうと他の何かであろうと、私は気にしません。

これを行うパッケージはありますか、それともこれを開発するのは簡単ですか?

4

1 に答える 1

7

ファントムタイプと呼ばれる機能設計手法を使用して、サンプルを機能させる方法を教えてください。

{-# LANGUAGE EmptyDataDecls #-}

data YES
data NO

data Name first middle last = Name String String String

emptyName :: Name NO NO NO
emptyName = Name "" "" ""

addFirst :: String -> Name first middle last -> Name YES middle last
addFirst s (Name a b c) = Name s b c

addMiddle :: String -> Name first middle last -> Name first YES last
addMiddle s (Name a b c) = Name a s c

addLast :: String -> Name first middle last -> Name first middle YES
addLast s (Name a b c) = Name a b s

printFullName :: Name YES middle YES -> String
printFullName (Name a b c) = a++b++c

の 3 つの型パラメーターを使用して、Nameどの名前が設定されているかを追跡します。printFullName姓と名を含む名前のみを受け入れます。未定義の名前を印刷しようとすると、型エラーが発生します。

*Main> printFullName $ addFirst "John" $ addLast "Smith" $ emptyName
"JohnSmith"
*Main> printFullName $ addFirst "John" $ addMiddle "Edward" $ emptyName

<interactive>:1:16:
    Couldn't match expected type `YES' against inferred type `NO'
      Expected type: Name YES YES YES
      Inferred type: Name YES YES NO
    In the second argument of `($)', namely
        `addFirst "John" $ addMiddle "Edward" $ emptyName'
    In the expression:
          printFullName $ addFirst "John" $ addMiddle "Edward" $ emptyName

これは非常に大雑把なエンコーディングであることに注意してください。ただし、ファントム タイプの力を示すことができれば幸いです。

于 2012-08-01T08:16:57.430 に答える