我需要实现动态调度,我使用了基于此页面的Existential 类型并生成了以下代码:
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE ExistentialQuantification #-}
module Cqrs.Command where
import Data.UUID
import Data.Time
import Data.Aeson
import Cqrs.Core
import Data.Text
import GHC.Generics
type CommandName = String
class (FromJSON command,ToJSON command , Show command) => Command_ command where
getCommandId :: command -> CommandId
getAggregateId :: command -> AggregateId
getCommandName :: command -> String
data Command = forall command . Command_ command => Command command
getMyCommandName :: Command -> String
getMyCommandName command = getCommandName command
我无法在 Command 数据类型上使用类型类 Command_ 中的函数,编译器会这样抱怨:
/Users/xxx/dev/gsdFlow/src/Cqrs/Command.hs:26:28: error:
• No instance for (Command_ Command)
arising from a use of ‘getCommandName’
• In the expression: getCommandName command
In an equation for ‘getMyCommandName’:
getMyCommandName command = getCommandName command
|
26 | getMyCommandName command = getCommandName command
| ^^^^^^^^^^^^^^^^^^^^^^
您需要解开Command
构造函数以获取其类型实际上是 的实例的值Command_
。
getMyCommandName :: Command -> String
getMyCommandName (Command c) = getCommandName c
FWIW,你的代码散发着强烈的存在反模式。为什么不做呢
data Command = Command
{ getCommandId :: CommandId
, getAggregateId :: AggregateId
, getCommandName :: String }
并完成?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句