Использование StringBuilder с выражением вычисления в F # - PullRequest
0 голосов
/ 09 июля 2020

У меня много кода, использующего построители строк, и я ищу способ упростить синтаксис.

Я начал смотреть на этот фрагмент: http://www.fssnip.net/7WR/title/Computation-expression-over-StringBuilder.

Во-первых, у меня общее смутное представление о вычислительных выражениях, но я никогда не писал ни одного, и это то, что я надеялся лучше понять, используя этот фрагмент.

Этот фрагмент можно использовать очень просто :

stringBuffer
    {
        "my first string\n"
        "and the second one\n"
        sprintf "hello %s" "thomas"
    }

и все это хорошо работает, и выводит строку.

Вопрос возникает при обработке списков. У меня есть такой код:

myList |> Map.map (fun _ data -> data.DescribeIntoAString)

это точно не сработает из-за карты. Как я могу заставить это работать?

1 Ответ

0 голосов
/ 09 июля 2020

Во-первых: из-за использования Map.map (в отличие от List.map) выясняется, что ваш myList на самом деле является картой, а не списком.

Теперь фрагмент, который вы связали предлагает пример использования последовательности чего-то внутри построителя вычислений:

let bytes2hex (bytes: byte array) : string =
    stringBuffer {
        for b in bytes -> b
    }

Вы можете использовать это средство для итерации по карте. Следует отметить, что при повторении элемента Map тип элемента - KeyValuePair<_, _>, значения которого можно получить через свойство .Value:

stringBuffer {
    for kvp in myList -> kvp.Value.DescribeIntoAString
}
...