我是否必须使用F#的面向对象设计支持来实现返回void的方法?
具体来说,如果我只是想在函数中打印消息怎么办? 我是否只需要在F#中创建一个成员方法来实现这个目标?
示例:
dealPlayer Hit {Face = Ace; Suit = Spades}
注意: 我还在学习F#。如果这个问题显得无知,我会道歉。
type Suit = | Spades
| Clubs
| Diamonds
| Hearts
type Face = | Two | Three | Four | Five
| Six | Seven | Eight | Nine | Ten
| Jack | Queen | King | Ace
type Card = {Face:Face; Suit:Suit}
type Deal = | Hand of Card * Card
| Hit of Card
let dealPlayer dealType =
match dealType with
| Hand (card1, card2) -> printfn "%A" (card1, card2)
| Hit card -> printfn "%A" card
dealPlayer Hit {Face = Ace; Suit = Spades}
答案 0 :(得分:4)
作为@Functional_S的答案,您可以使用printfn
,但作为一般观察,函数式编程的主要好处之一是避免副作用。
最终,所有程序都有副作用,但功能方法是将副作用推到你正在构建的任何系统的边缘。 (顺便提一下,对于大多数可维护的,成功的面向对象的体系结构也是如此;只有你从C#或Java这样的语言中获得的支持才能减少。)
因此,不要让dealPlayer
产生副作用,而应将其设为纯函数:
let dealPlayer dealType =
match dealType with
| Hand (card1, card2) -> sprintf "%A" (card1, card2)
| Hit card -> sprintf "%A" card
这会将函数的类型更改为Deal -> string
。 (但是,该功能的名称现在可能会有点误导。)
在系统的边缘,您仍然可以根据需要打印值,方法是将字符串换成printfn
:
> dealPlayer (Hit {Face = Ace; Suit = Spades}) |> printfn "%s";;
{Face = Ace;
Suit = Spades;}
val it : unit = ()
这更灵活,因为你推迟了引入副作用的决定,直到你不能再推迟它为止。
答案 1 :(得分:1)
你可以使用它,它可以很好地打印小样本
let print x = printfn "%+A" x
或者如果您需要返回值
let toString x = sprintf "%+A" x