Как сделать многострочные лямбда-выражения в f#?

вы можете попробовать это:

Sub RecoverData()
    Application.ScreenUpdating = False
    Dim x As Workbook
    Dim t As Range

    '## Open both workbooks first:
    Set x = Workbooks.Open(Application.ActiveWorkbook.Path & "\data.xlsx")

    With x.Sheets("Feuil1") ' reference source sheet
        Set t = .Rows(1).Find("Vendor name", lookat:=xlWhole) ' try searching wanted header in referenced sheet first row
        If Not t Is Nothing Then ' if found
            .Rows(1).AutoFilter Field:=t.column, Criteria1:=Array("a*", "b"), Operator:=xlFilterValues ' filter data
            Intersect(.UsedRange, t.EntireColumn).SpecialCells(xlCellTypeVisible).Copy _
            Destination:=ThisWorkbook.Sheets("Feuil2").Range("A1") '<<== paste filtered column to destination sheet A1 cell (instead of B1), to match your subsequent removeduplicates call
            ThisWorkbook.Sheets("Feuil2").Range("A1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes
            .AutoFilterMode = False
        Else
            MsgBox "Column Name Not Found"
        End If
    End With
    x.Close

    Application.ScreenUpdating = True
End Sub
16
задан Simon 2 May 2009 в 06:20
поделиться

2 ответа

Многострочная лямбда в F # is просто

(fun args ->
    lots
    of
    code
    here
)

Весь код будет выглядеть примерно так

open System.IO

type MyClass() as this =
    let Render(tw : TextWriter) =
        this.Tag(fun() ->
            tw.WriteLine("line1")
            tw.WriteLine("line2")
        )
        this.Tag(fun(value : string) ->
            tw.WriteLine("line1")
            tw.WriteLine(value)
        , "a"
        )
    member this.Tag(action) = 
        action()
    member this.Tag(action, x) =
        action(x)

, при условии, что я не допустил ошибок транскрипции. (Я использовал типы функций F #, а не делегаты Action в общедоступном интерфейсе.)

27
ответ дан 30 November 2019 в 17:28
поделиться

Если все, что вы хотите сделать, это написать многострочные лямбда-выражения, вы можете связать несколько операторов вместе, используя оператор точки с запятой в скобках. Пример:

(fun () -> (write_line "line 1" ; write_line "line 2"))

и

(fun val -> (write_line "line 1" ; write_line val))

Хотя второй пример, который я привел, работает, только если тип val - string.

Предостережение: Я не знаю особенностей F #. Я пишу это из фона Objective Caml. Языки очень похожи, но могут быть некоторые различия, которые делают моё предположение немного неверным. Кроме того, сейчас у меня нет машины с интерпретатором ocaml или F #, поэтому я не могу проверить эти фрагменты, чтобы убедиться, что они работают.

5
ответ дан 30 November 2019 в 17:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: