1

次のように適用できる関数の定義を考え出そうとしています:

setProperty Left 45 Px
setProperty Position Absolute
setProperty Visible True

私が試したGADTs

data StyleUnit = Px | Pct | Em
data PositionP = Absolute | Relative | Static

data Property a where
  Position :: Property PositionP
  Left :: Property (Integer -> StyleUnit)
  Visible :: Bool

次の署名を使用します。

setProperty :: Property a -> a -> IO ()

残念ながら、これはうまくいかないようです。これはまったく達成可能ですか、または などの特殊な関数バージョンを用意した方がよいsetPropertyPositionでしょsetPropertyLeftうか?

4

3 に答える 3

0

正確に何を意味するのかわかりませんsetPropertycreate propertyを意味する場合は、次のようなことができます。

data StyleUnit = Px | Pct | Em
data PositionP = Absolute | Relative | Static

data Property a where
  Position :: PositionP -> Property PositionP
  Left :: (Integer,StyleUnit) -> Property (Integer, StyleUnit)
  Visible :: Bool -> Property Bool

setProperty :: (a -> Property a) -> a -> Property a
setProperty = ($)

例:

setProperty Left (45,Px)
于 2013-08-19T08:01:46.807 に答える