Обновить запись несколько раз с помощью аргументов из списка - PullRequest
0 голосов
/ 17 января 2020

Что у меня есть:

type Item = 
  {
    Name : string
  }

type Model = 
  { 
    Items : Item list
  }

let init = {
  Items = []
  }

type Msg =
  |AddItem
  |DoNothing

let update msg model =  //Msg -> Model -> Model
  match msg with
  |AddItem -> {model with Items = List.append [{Name = "NewItem"}] model.Items}
  |DoNothing -> model

let rec apply f model list = //(a' -> 'b -> 'b) -> 'b -> 'a list -> 'b
        match list with
        |[] -> model
        |head::tail -> let model' = f head model
                       apply f model' tail

let msgs = [AddItem; DoNothing; AddItem]

let model' = apply update init msgs

дает результат:

val model' : Model = { Items = [{ Name = "NewItem" }; { Name = "NewItem" }] }

Я проверил fold , map и некоторые другие , но похоже, что ни одна из этих функций не работает так же, как моя apply .

Есть ли встроенная функция в List или где-то еще, которая является так же, как мой применить ? Потому что, если есть, я бы лучше использовал это.

1 Ответ

0 голосов
/ 18 января 2020

Ваша apply функция аналогична List.fold с аргументами функции-накопителя в другом порядке. Тип apply:

(a' -> 'b -> 'b) -> 'b -> 'a list -> 'b

, а тип List.fold:

(b' -> 'a -> 'b) -> 'b -> 'a list -> 'b

, поэтому вы можете заменить свой вызов на apply на:

List.fold (fun model msg -> update msg model) init msgs
...