【问题标题】:How to pattern match on a tuple of generic type? F#如何在泛型类型的元组上进行模式匹配? F#
【发布时间】:2019-04-23 04:04:24
【问题描述】:

我正在尝试实现的函数从 tictactoe 游戏返回一个最佳移动,该游戏输入一个返回类型为 (GameState -> Player -> Option (Move) * int -> Move)的函数

基本上,我需要获取定义为

的值“移动”
type Move = 
            { Row:int; Col:int }
type Player = Nought | Cross
type GameState = 
  { Turn: Option<Player>; Size:int; board:Map<int*int, Option<Player>> }

作为一个输入函数返回一个元组(Some(Move类型的最佳移动),与移动相关的分数(整数))

我认为这会起作用

match (MiniMax game.board game.Turn) with
                | (Some({Row = x; Col = y;}), _) -> {Row=x Col=y}
                | (None, _) ->

但我收到一条错误消息: “这个表达式的类型应该是‘GameState -> Player -> Option (Move) *int’ 但这里有类型 a * b'"

如何匹配 (MiniMaxResult:Option(Move) * int) 的结果,以便仅提取 Move 类型??

两个玩家;零或交叉 和游戏状态;包含有关棋盘动作、大小、轮到谁的信息

【问题讨论】:

  • 需要更多上下文,因为您提供的代码中没有提及 GameStatePlayer 类型,但错误消息中有
  • 更新帖子,错误信息在第一个匹配模式上..
  • 很抱歉再次询问您,但乍一看,该错误消息在我看来就像某些函数需要另一种类型或缺少显式类型注释。您能否提供MiniMax 函数的代码

标签: types f# pattern-matching


【解决方案1】:

所以我在您的代码中看到的第一件事是您因partial application 而失败。您的模式匹配需要Option&lt;Move&gt;*int,但您的MinMaxGenerator 返回返回GameState -&gt; Player -&gt; Option&lt;Move&gt;*int。因此,您必须传递一个GameState 类型的参数和一个Player 类型的参数才能返回您期望的结果。不确定这是否是唯一的问题。

【讨论】:

  • 根据我的经验,编译器消息有时可能会产生误导。但我清楚地看到类型不适合并且包含在编译器错误消息中。另外请确保您阅读了我的更新版本,因为MinMax 绝对不需要 4 个参数。相反,您也需要使用已经拥有但类型正确的那 2 个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 2011-10-25
  • 2018-06-20
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
相关资源
最近更新 更多