我有一个基本的append
函数
let append item list = item :: list
我有一个'列表选项和选项Some("something")
let listOption = Some []
我想将值"something"
添加到listOption
。如何在不使用模式匹配和Option.get
的情况下通过提升append
函数来做到这一点?
任何帮助将不胜感激
答案 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