私はハスケルを新しくしており、証券取引所のモデルを探しています。これはライブラリであり、したがってユーザによって定義されるべきである。私がこれを使う方法は、ユーザーにこのようなことを定義させることです。Haskellのモデリング交換
data MyExchange = MyExchange { name :: ExchangeName
, base :: Currency
, quote :: Currency }
deriving (Eq, Show)
instance Exchange MyExchange
data MyExchangeBookMessage =
MyExchangeBookMessage { time :: Time
, exchange :: MyExchange
, price :: Price
, side :: Side
, amount :: Maybe Amount }
deriving (Eq, Show)
instance ExchangeBookMessage MyExchangeBookMessage
私は以下を試しましたが、直ちにタイプクラスのいくつかの制限がありました。以下はコードとエラーメッセージです。具体的には、複数の型を持つ型クラスをパラメータ化する代替手段は何ですか?
src/Lib.hs:22:1: error:
• Too many parameters for class ‘ExchangeMessage’
(Use MultiParamTypeClasses to allow multi-parameter classes)
• In the class declaration for ‘ExchangeMessage’
後、私はこのようなタイプのクラスを実装できるようにしたいと思います:
class Strategy s where
run (Message m, Action a) => s -> m -> a
ここ
は
module Lib where
data Side = Buy | Sell deriving (Eq, Show)
newtype Amount = Amount Rational deriving (Eq, Show)
newtype Price = Price Rational deriving (Eq, Show)
newtype Currency = Currency String deriving (Eq, Show)
newtype Time = Time Integer deriving (Eq, Show)
type ExchangeName = String
class Exchange a where
name :: a -> ExchangeName
base :: a -> Currency
quote :: a -> Currency
class Message a where
time :: a -> Time
class (Message a, Exchange e) => ExchangeMessage a e where
exchange :: a -> e
class ExchangeMessage a b => BookMessage a b where
price :: a -> Price
side :: a -> Side
amount :: a -> Maybe Amount
、エラーメッセージライブラリのコードです
Strategy
の実装では、run
関数は抽象的なメッセージmを生成し、関連するMessage
データコンストラクタとパターンを一致させ、特定のアクションを返します。
私はいくつかのScalaコードを移植しています。 Scalaで私が一番下に、具体的なケースクラスを持つ形質の階層を使用した:ビジネスの
trait Exchange {
def name: String
def base: Currency
def quote: Currency
}
case class MyExchange(base: Currency, quote: Currency) {
val name = "my-exchange"
}
trait Message {
def time: Long
}
trait ExchangeMessage extends Message {
def exchange: Exchange
}
trait BookMessage extends ExchangeMessage {
def price: Double
def side: Side
def amount: Option[Double]
}
case class MyBookMessage(time: Long, price: Double, side: Side, amount: Option[Double]) {
def exchange: Exchange = MyExchange(...)
}
「MultiParamTypeClassesを使用して複数パラメータクラスを使用できるようにする」という提案があります。それを有効にするには、ファイルの最初の行に '{ - #LANGAUGE MultiParamTypeClasses# - }'を置きます。 – luqui
これはうまくいくでしょうが、 'BookMessage'のメソッドを使用しようとすると、他の問題に遭遇します。 'b'がそこに存在するはずです... – luqui
@luqui:' BookMessage'は 'ExchangeMessage'を拡張しています:' b'は 'ExchangeMessage'から来る' Exchange'の型です。 –