在 F# 中,如何修复值类型“a->'b->Model”的模式匹配错误

Ala*_*yne 1 f# pattern-matching

(我是 F# 新手)。我在 F# 中有以下定义:

init i j =
    { Id = Guid.NewGuid ()
      InnerRows = [0 .. 2] |> List.map (Cell.init i j) 
      SelectedInnerRow = None}

 let update msg m =
    match msg with
    | Select id -> { m with SelectedInnerRow = id }
    | Reset -> init
Run Code Online (Sandbox Code Playgroud)

其中更新函数在“重置 -> 初始化”上显示以下错误: 模式匹配表达式的所有分支必须返回与第一个分支相同类型的值,其中此处为“模型”。该分支返回类型为 ''a -> 'b -> Model' 的值

“a -> 'b -> Model”是什么意思,如何解决这个问题?

谢谢。

TIA

Fyo*_*kin 5

正如错误消息所示:模式匹配的所有分支必须返回相同类型的值

你的Select id -> ...分支返回一个类型的值Model

您的Result -> init分支返回 function init,它具有类型'a -> 'b -> Model- 也就是说,它接受某些类型的两个参数'a'b返回 a Model

类型不匹配。不同种类。看?

从语义来看,我猜测您真正希望函数update返回的是Model. 如果是这样,您需要为init函数提供两个参数,以便它返回一个Model,这可以是模式匹配表达式的第二个分支的结果:

| Result -> init 0 0
Run Code Online (Sandbox Code Playgroud)

注意:我实际上不确定0 0这种情况下的参数是否正确,我只是猜测。如果不知道它们的Cell.init i j作用以及它期望什么类型的参数,就无法知道它们应该是什么。

你必须弄清楚init这里实际的参数需要什么并将它们传递进去。