У меня есть dataType, называемый signal, который может быть Double или Integer. Я реализовал его следующим образом.
data Signal a = Signal
{ name :: String
, value :: a
}
Теперь я хочу предоставить две разные реализации на основе Signal в моем методе
generateSignal :: Signal a -> a
generateSignal Signal(name, value :: Bool) = value
generateSignal Signal(name, value :: Double) = value + 1.0
Есть ли способ добиться этого?
Редактировать:
Дополнительные сведения: В основном я пишу библиотеку в haskell для торговли акциями. Я планировал создать тип Сигнала, подобный этому, и затем в конце концов написал простые правила [создайте пользовательский интерфейс в будущем].
Так что некоторым примером Сигналов будет
shouldBuyStock :: Signal Bool
shouldBuyStock = Signal {
name: "shouldBuyClassifier",
value: shouldBuyClassifier
--- This is a ML Model will tells should I buy any given stock
}
expectedConfidenceToRise :: Signal Bool
expectedConfidenceToRise = Signal {
name: "expectedConfidenceToRise",
value: expectedConfidenceToRise
--- This is a ML Model will tells should I buy any given stock and gives a numerical model
}
В конце концов, я хочу создать пользовательский интерфейс, который позволит мне писать правила, такие как
[("shouldBuyClassifier", True), ("expectedConfidenceToRise", 0.9)] = Buy
Учитывая приведенное ниже решение, я бы создал тип
class comparableSignal where
matches :: Signal a -> Signal b -> Bool
instance comparableSignal Bool Bool where
generateSignal (Signal _ value1) (Signal _ value2) = value1 == value2
instance comparableSignal Bool Double where
generateSignal (Signal _ value1) (Signal _ value2) = False
instance comparableSignal Double Double where
generateSignal (Signal _ value1) (Signal _ value2) = value1 == value2
instance comparableSignal Double Bool where
generateSignal (Signal _ value1) (Signal _ value2) = False
. Я уже принял ответ в качестве ответа на оригинал. вопрос.
Спасибо за помощь