我们正在尝试从F#中的http://www.haskell.org/all_about_monads/html/maybemonad.html构建Haskell-MaybeMonad示例.
这个想法是在两个词典中搜索一个mailaddress.如果两个查找中的一个返回结果,我们将查看第三个查找.
let bindM x k =
match x with
| Some value -> k value
| None -> None
let returnM x = Some x
type MaybeBuilder() =
member this.Bind(x, k) = bindM x k
member this.Return(x) = returnM x
member this.ReturnFrom(x) = x
member this.Delay(f) = f()
let maybe = MaybeBuilder()
//Sample dictionaries
let fullNamesDb =
[("Bill Gates", "billg@microsoft.com")
("Bill Clinton", "bill@hope.ar.us")
("Michael Jackson", "mj@wonderland.org")
("No Pref Guy", "guy@nopref.org")]
|> Map.ofList
let nickNamesDb =
[("billy", "billg@microsoft.com") …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过返回双选项而不是双精度来编写一些处理错误的函数.其中许多函数互相调用,因此将双选项作为输入来输出其他双选项.问题是,我不能用双选项做什么,我可以用双打做 - 简单的事就是用'+'添加它们.
例如,一个除以两个双精度数的函数,并返回一个带有none的双选项,用于除以零错误.然后另一个函数调用第一个函数并为其添加另一个double选项.
请告诉我是否有办法做到这一点,或者我是否完全误解了F#选项类型的含义.
我刚开始我的第一个 F# 项目并且来自 JVM 世界,我真的很喜欢 Kotlin 的可空性语法,并且想知道如何在 F# 中实现类似的紧凑语法。
下面是一个例子:
class MyClass {
fun doSomething() {
// ...
}
}
// At some other place in the code:
val myNullableValue: MyClass? = null
myNullableVallue?.doSomething()
Run Code Online (Sandbox Code Playgroud)
这是做什么的:
myNullableValue是没有 null的,即有一些数据,doSomething()是该对象上。myNullableValue是null(就像上面的代码一样),什么都不会发生。据我所知,F# 等效项是:
type MyClass =
member this.doSomething() = ()
type CallingCode() =
let callingCode() =
let myOptionalValue: MyClass option = None
match myOptionalValue with
|Some(x) -> x.doSomething()
|None -> ()
Run Code Online (Sandbox Code Playgroud)
在 Kotlin …
假设有一个type r = {A : int; B : string; C : int; D : string}和一些值:
let aOptional : int option = ...
let bOptional : string option = ...
let cOptional : int option = ...
let dOptional : string option = ...
Run Code Online (Sandbox Code Playgroud)
如何r optional从他们的eleganlty(没有嵌套的案件等)构建?
顺便说一下,这是如何在haskell中完成的Control.Applicative:
data R = R { a :: Integer, b :: String, c :: Integer, d :: String}
R <$> aOptional <*> bOptional <*> cOptional <*> dOptional :: Maybe …Run Code Online (Sandbox Code Playgroud)