实现一个打印输出而没有面向对象支持的方法?

时间:2015-12-03 12:46:38

标签: f#

我是否必须使用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}

2 个答案:

答案 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