为什么在我的示例中不支持该泛型函数?

托马斯·詹森(Tomas Jansson)

我正在尝试学习F#,并整理了以下代码:

open System.Collections.Generic

type Version = Version of int
type AggregateId = AggregateId of int

type IEventdata = interface end
type EventMeta = EventMeta of AggregateId * Version
type Event = Event of EventMeta * IEventdata 

type ICommandData = interface end
type CommandMeta = CommandMeta of AggregateId * Version
type Command = CommandMeta * ICommandData

type EventStore = {
    GetEvents : AggregateId -> Event seq;
    Insert : Event seq -> unit
}

let commandDispatcherFactory (mapping: (Command -> Event seq -> Event seq), es: EventStore) =
    (
        fun (command: Command) -> 
            match command with
            | (CommandMeta(aggregateId, version), commandData) ->
                let events = es.GetEvents (aggregateId)
                let resultingEvents = mapping command events
                (es.Insert(resultingEvents))
    )

type DummyCommand = 
    | Command1
    interface ICommandData

type DummyCommand2 = 
    | Command2
    interface ICommandData

type UnsupportedCommand = 
    | Command3

let dummyMapping = (fun ((command, commandData):Command) (events: Event seq) ->
    match commandData with
    | :? DummyCommand as dummyCommand -> 
        (printfn "Handling Command: %A" dummyCommand)
        Seq.empty<Event>
    | :? DummyCommand2 as dummyCommand -> 
        (printfn "Handling Command: %A" dummyCommand)
        Seq.empty<Event>
    | _ -> 
        (printfn "Unsupported command: %A" commandData)
        Seq.empty<Event>
)

let dummyEs = {
    GetEvents = (fun (aggregateId) -> Seq.empty<Event>);
    Insert = (fun (events:Event seq) -> ())
}
dummyMapping (CommandMeta(AggregateId(1),Version(1)), Command1) Seq.empty<Event>
dummyMapping (CommandMeta(AggregateId(1),Version(1)), Command2) Seq.empty<Event> // Why does this work?

let commandDispatcher = commandDispatcherFactory(dummyMapping, dummyEs)
commandDispatcher (CommandMeta(AggregateId(1),Version(1)), Command1)
commandDispatcher (CommandMeta(AggregateId(1),Version(1)), Command2) // this doesn't work

我知道这可能是一堵文字墙,但是我没有设法缩小文字范围。这是对我的commandDispatcher的最后一次调用不起作用,我不知道为什么。我知道可能还有其他事情可以做得更好,但这是我正在努力的事情:)

千伏特

这是简化的复制品:

let f x (y:System.IComparable) = ()
let g = f 1

g 3
g "test" // not okay

let g' : System.IComparable -> unit = f 1
g' 3
g' "test" // okay

let g'' x = f 1 x
g'' 3
g'' "test" // okay

发生的是编译器为推断出通用类型gg:('a -> unit) when 'a :> System.IComparable在我的示例中)。但是,它g是一个语法值,因此不能通用(请参阅有关值限制的问题),因此编译器需要选择一个特定类型。如果您根本不使用g,则会出现编译器错误。如果仅在一种具体类型上使用它,则编译器将选择该类型。如果您在多种类型上使用它,则编译器将基于所使用的第一种类型进行专业化处理,并在此之后引发错误。

两种解决方法是使用非泛型类型注释或eta-expand,以便这g不是语法值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的示例不支持该通用函数?

来自分类Dev

为什么我不支持URI

来自分类Dev

CoreBluetooth-不支持该请求。为什么?

来自分类Dev

为什么C11不支持Lambda函数

来自分类Dev

为什么CSS不支持类似函数的构造?

来自分类Dev

为什么 clojure 核心库不支持索引函数?

来自分类Dev

为什么我不支持请求方法GET?

来自分类Dev

为什么不支持我的URI?FileInfo ArgumentException

来自分类Dev

为什么IE不支持我的CSS定位

来自分类Dev

为什么不支持我的URI?FileInfo ArgumentException

来自分类Dev

为什么我新建的PC盒不支持Miracast?

来自分类Dev

为什么我不支持 IQueryable 异常?

来自分类Dev

chrome 不支持类中的箭头函数,但通过 babel 可以正常工作,为什么?

来自分类Dev

为什么Java中不支持向后断言?

来自分类Dev

为什么C#不支持变体泛型类?

来自分类Dev

Swift为什么不支持例外?

来自分类Dev

为什么不支持dnd模块?

来自分类Dev

不支持泛型?

来自分类Dev

为什么向量不支持大小作为成员变量,如 Java 类中的长度变量,而不是函数 size()?

来自分类Dev

为什么泛型专业化会在泛型函数中丢失

来自分类Dev

为什么在具有可比约束的泛型函数中丢失泛型类型信息?

来自分类Dev

为什么我无法从数据框中获取饼图。TypeError:“ str”和“ int”的实例之间不支持“ <”

来自分类Dev

为什么我的旧平板电脑在混合应用程序中不支持某些CSS线?

来自分类Dev

我的PC不支持ACPI,该怎么办?

来自分类Dev

我的PC不支持ACPI,该怎么办?

来自分类Dev

为什么此泛型函数不调用重写函数

来自分类Dev

为什么这个泛型函数不调用重写函数

来自分类Dev

该路由不支持GET方法。支持的方法:laravel中的POST ...我缺少什么吗?

来自分类Dev

为什么在使用“ -c”参数调用urxvtc时不支持zsh函数?

Related 相关文章

  1. 1

    为什么我的示例不支持该通用函数?

  2. 2

    为什么我不支持URI

  3. 3

    CoreBluetooth-不支持该请求。为什么?

  4. 4

    为什么C11不支持Lambda函数

  5. 5

    为什么CSS不支持类似函数的构造?

  6. 6

    为什么 clojure 核心库不支持索引函数?

  7. 7

    为什么我不支持请求方法GET?

  8. 8

    为什么不支持我的URI?FileInfo ArgumentException

  9. 9

    为什么IE不支持我的CSS定位

  10. 10

    为什么不支持我的URI?FileInfo ArgumentException

  11. 11

    为什么我新建的PC盒不支持Miracast?

  12. 12

    为什么我不支持 IQueryable 异常?

  13. 13

    chrome 不支持类中的箭头函数,但通过 babel 可以正常工作,为什么?

  14. 14

    为什么Java中不支持向后断言?

  15. 15

    为什么C#不支持变体泛型类?

  16. 16

    Swift为什么不支持例外?

  17. 17

    为什么不支持dnd模块?

  18. 18

    不支持泛型?

  19. 19

    为什么向量不支持大小作为成员变量,如 Java 类中的长度变量,而不是函数 size()?

  20. 20

    为什么泛型专业化会在泛型函数中丢失

  21. 21

    为什么在具有可比约束的泛型函数中丢失泛型类型信息?

  22. 22

    为什么我无法从数据框中获取饼图。TypeError:“ str”和“ int”的实例之间不支持“ <”

  23. 23

    为什么我的旧平板电脑在混合应用程序中不支持某些CSS线?

  24. 24

    我的PC不支持ACPI,该怎么办?

  25. 25

    我的PC不支持ACPI,该怎么办?

  26. 26

    为什么此泛型函数不调用重写函数

  27. 27

    为什么这个泛型函数不调用重写函数

  28. 28

    该路由不支持GET方法。支持的方法:laravel中的POST ...我缺少什么吗?

  29. 29

    为什么在使用“ -c”参数调用urxvtc时不支持zsh函数?

热门标签

归档