F #: добавление значения параметра в список параметров - PullRequest
0 голосов
/ 28 октября 2018

У меня есть базовая append функция

let append item list = item  :: list

И у меня есть опция списка и опция Some("something")

let listOption = Some []

Я хочу добавить значение "something"до listOption.Как я могу сделать это без использования сопоставления с шаблоном и Option.get, но с помощью функции append?

Любая помощь будет оценена

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Вы можете использовать возможно вычислительное выражение

type MaybeBuilder() =
    member this.Bind(m, f) = Option.bind f m
    member this.Return(x) = Some x

let maybe = new MaybeBuilder()
let append item list = item  :: list
let appendLifted item list =
    maybe {
        let! l = list
        let! i = item
        return append i l
    }

[<EntryPoint>]
let main argv =
    appendLifted (Some "abc") (Some [])
    0
0 голосов
/ 28 октября 2018

Это похоже на домашнюю работу ...

Если вы хотите добавить значение (а не опцию) в начало опции списка, вы можете просто сделать это, которое вернет None, если списокопция None:

let liftedAppend item optList =
    optList |> Option.bind (fun list -> Some (item :: list))

liftedAppend подпись:

'a -> 'a list option -> 'a list option

Но если говорить о снятии stricto sensu, так как подпись вашей функции добавления:

'a -> 'a list -> 'a list

подпись поднятой функции должна быть:

'a option -> 'a list option -> 'a list option

Это означает, что первый аргумент должен быть опцией, и я предполагаю, что вы хотите проверить, является ли это Some или None.Если так внимательно, прочитайте ответы других.

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

let liftedAppend optItem optList =
    optList |> Option.bind (fun list -> 
        optItem |> Option.bind (fun item -> Some (item :: list)))
0 голосов
/ 28 октября 2018

Это работает:

listOption 
|> Option.map (append 11)
|> printfn "%A"  // Some [11]

, но для создания поднятого append:

let liftedAppend v = Option.map (append v)

listOption 
|> liftedAppend 11
|> printfn "%A" // Some [11]

Подпись функций:

  • val append : 'a -> 'a list > 'a list
  • val liftedAppend: 'a -> 'a list option -> 'a list option

Чтобы передать оба параметра в качестве параметров, вы можете использовать Option.map2:

let liftedAppend2 vO = vO |> Option.map2 append

listOption 
|> liftedAppend2 (Some 11)
|> printfn "%A"  // Some [11]

Который имеет подпись:

  • val liftedAppend2: a option -> 'a list option -> 'a list option
...