问题实现 OOP 的动态调度机制

尼古拉斯·海宁

我需要实现动态调度,我使用了基于此页面的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章