6

私は F# を学んでいて、Python の経験があります。私は Python の関数デコレーターがとても好きです。F# でそれに似たものがあるかどうか疑問に思っていましたか?

4

1 に答える 1

10

F# には、関数デコレーター用のシンタックス シュガーはありません。

型の場合、attribute を使用StructuredFormatDisplayして printf の内容をカスタマイズできます。F# 3.0 サンプル パックの例を次に示します。

[<StructuredFormatDisplayAttribute("MyType is {Contents}")>]
type C(elems: int list) =
   member x.Contents = elems

let printfnSample() = 
    printfn "%A" (C [1..4])

// MyType is [1; 2; 3; 4]

関数については、関数合成を使用してPython のデコレータを簡単に表現できます。たとえば、この Python の例

def makebold(fn):
    def wrapped():
        return "<b>" + fn() + "</b>"
    return wrapped

def makeitalic(fn):
    def wrapped():
        return "<i>" + fn() + "</i>"
    return wrapped

@makebold
@makeitalic
def hello():
    return "hello world"

次のようにF#に変換できます

let makebold fn = 
    fun () -> "<b>" + fn() + "</b>"

let makeitalic fn =
    fun () -> "<i>" + fn() + "</i>"

let hello =
    let hello = fun () -> "hello world"
    (makebold << makeitalic) hello
于 2012-10-14T09:16:40.900 に答える