Haskell различная реализация, основанная на типе класса - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть 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

. Я уже принял ответ в качестве ответа на оригинал. вопрос.

Спасибо за помощь

1 Ответ

3 голосов
/ 28 апреля 2020

Да, с типами очков:

data Signal a = Signal
  { name :: String
  , value :: a
  }

class GenerateSignal a where
  generateSignal :: Signal a -> a

instance GenerateSignal Bool where
  generateSignal (Signal _ value) = value

instance GenerateSignal Double where
  generateSignal (Signal _ value) = value + 1.0
...