F#的新手,想知道为什么在定义binaryMathFn时出现编译时错误。
我还将就更改此问题的标题提出建议。它不是最具描述性的:)
type Stack = StackContents of float list
let push item (StackContents stack) =
match stack with
| [] -> StackContents [item]
| _ -> StackContents (item::stack)
let pop (StackContents stack) =
match stack with
| [] -> failwith "Stack is empty, nothing to pop!"
| h::t -> (h, StackContents t)
let binaryMathFn fn (StackContents stack) = // Expression type is expected to be of type Stack?
let item1, stack' = pop stack
let item2, stack'' = pop stack'
let result = fn item1 item2
push result stack''
答案在于类型,但是在解释错误之前,这是使binaryMathFn
函数编译的一种方法:
let binaryMathFn fn stack =
let item1, stack' = pop stack
let item2, stack'' = pop stack'
let result = fn item1 item2
push result stack''
您对的定义Stack
是歧视工会,其中一个工会案例称为StackContents
。当您将函数参数声明为时(StackContents stack)
,您使用的是表示以下内容的简写形式:
输入是类型Stack
,但立即将该输入与单个StackContents
并集大小写匹配,float list
从输入中有效解包,然后将其分配float list
给symbol stack
。
如果像我上面建议的那样,将参数声明更改为simple stack
,则F#编译器可以自动推断出它stack
是一个Stack
值,因为该函数使用pop
具有以下函数签名的函数:
Stack -> float * Stack
将其读取为以aStack
作为输入并返回float
andStack
作为输出的元组的函数。由于binaryMathFn
电话pop
与stack
,编译器可以推断stack
必须是一个Stack
值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句