F#:将选项的值附加到列表选项

时间:2018-10-28 12:28:50

标签: function functional-programming f# lifting

我有一个基本的append函数

let append item list = item  :: list

我有一个'列表选项和选项Some("something")

let listOption = Some []

我想将值"something"添加到listOption。如何在不使用模式匹配和Option.get的情况下通过提升append函数来做到这一点?

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:0)

您可以使用也许计算表达式

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

答案 1 :(得分:0)

看起来像是家庭作业...

如果要在列表选项的开头添加一个值(不是选项),则只需执行此操作,如果列表选项为“无”,则将返回“无”:

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

liftedAppend签名为:

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

但是谈论解除严格意义,因为您的append函数的签名是:

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

解除功能的签名应为:

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

这意味着第一个参数必须为选项,我想您想检查它是否为Some或None。如果是这样,请认真阅读他人的答复。

您可以使用类似这样的东西,它们可以消除Lanayx的计算表达式。

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

答案 2 :(得分:-1)

这有效:

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