F# 应为bool,但类型不同

F# 应为bool,但类型不同,f#,F#,在下面的方法中,我得到了以下错误:错误FS0001:当尝试在if表达式中调用isSample时,此表达式应具有类型bool,但此处具有类型output list*ProbTree->bool。我不知道为什么我会得到这个消息 isSample(os,t)当前的类型为'a*'b->结果列表*ProbTree->bool。有什么想法吗?我不明白的是,为什么它突然要求键入bool let rec isSample(os, t) = function | ([], Branch(_, p, b1, b2)

在下面的方法中,我得到了以下错误:
错误FS0001:当尝试在if表达式中调用isSample时,此表达式应具有类型bool,但此处具有类型output list*ProbTree->bool
。我不知道为什么我会得到这个消息

isSample(os,t)当前的类型为
'a*'b->结果列表*ProbTree->bool
。有什么想法吗?我不明白的是,为什么它突然要求键入
bool

let rec isSample(os, t) = function
| ([], Branch(_, p, b1, b2))                         -> false
| (os, Branch(_, p, b1, b2)) when List.length os = 1 -> true 
| (h::t, Branch(_, p, b1, b2)) ->
    if h = S then isSample(t, b1) else isSample(t, b2) //This is where I get the error
| _ -> false


type Outcome  = | S | F 
type Sample   = Outcome list
type ProbTree = | Branch of string * float * ProbTree * ProbTree
                | Leaf of string

第一个
'a*'b
参数是什么?看起来您打算直接在一个输入对上进行匹配,因此您应该将第一行更改为
let rec isSample=function…
是的,这似乎可以消除错误。是因为将参数添加到第一行会使它期望它们出现两次还是更多?我不完全确定它的效果是什么。
let rec isSample(os,t)=function |…
let rec isSample(os,t)x=match x with |…
的缩写,因此您声明了一个带有两个参数的函数。您没有在任何地方使用第一对,并且在递归调用中只提供一个参数。编译器已推断返回类型应为
bool
,因为在以前的分支中返回
true
false
,但递归调用返回一个带有一个参数的函数,因此类型错误。第一个
'a*'b
参数是什么?看起来您打算直接在一个输入对上进行匹配,因此您应该将第一行更改为
let rec isSample=function…
是的,这似乎可以消除错误。是因为将参数添加到第一行会使它期望它们出现两次还是更多?我不完全确定它的效果是什么。
let rec isSample(os,t)=function |…
let rec isSample(os,t)x=match x with |…
的缩写,因此您声明了一个带有两个参数的函数。您没有在任何地方使用第一对,并且在递归调用中只提供一个参数。编译器已推断返回类型应为
bool
,因为在以前的分支中返回
true
false
,但递归调用返回一个带有一个参数的函数,因此类型错误。