- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只知道F#。我还没有学过其他函数式编程语言。我看到的所有关于 monad 的例子都只描述了 bind 和 unit 方法。 F# 有很多关键字(例如 let!
、 do!
等),允许您在同一个计算表达式中执行不同的操作。这似乎比基本的绑定(bind)和单元方法更强大。这是 F# 独有的还是在函数式编程语言中很常见?
最佳答案
是的,我认为计算表达式的 F# 语法是独一无二的,因为它为不同类型的计算提供了直接的语法支持。它可以用于处理 monoids、普通 monads 以及来自 Haskell 的 MonadPlus 计算。
我在 my Master thesis 的介绍中写过这些.我相信它是非常易读的部分,所以你可以去第 27 页阅读它。无论如何,我将在这里复制示例:
Monoid 仅用于使用一些“+”操作(Combine
)连接值。例如,您可以使用它来构建字符串(这是低效的,但它展示了这个想法):
type StringMonoid() =
member x.Combine(s1, s2) = String.Concat(s1, s2)
member x.Zero() = ""
member x.Yield(s) = s
let str = new StringMonoid()
let hello = str { yield "Hello "
yield "world!" };;
type MaybeMonad() =
member x.Bind(m, f) =
match m with Some(v) -> f v | None -> None
member x.Return(v) = Some(v)
let maybe = new MaybeMonad()
let rec productNameByID() = maybe {
let! id = tryReadNumber()
let! prod = db.TryFindProduct(id)
return prod.Name }
MonadPlus
在 Haskell 中)是两者的结合。它有点像可以产生多个值的一元计算。一个常见的例子是列表(或序列),它可以实现绑定(bind)和组合:
type ListMonadPlus() =
member x.Zero() = []
member x.Yield(v) = [v]
member x.Combine(a, b) = a @ b
member x.Bind(l, f) = l |> List.map f |> List.concat
let list = new ListMonadPlus()
let cities = list {
yield "York"
yield "Orleans" }
let moreCities = list {
let! n = cities
yield n
yield "New " + n }
// Creates: [ "York"; "New York"; "Orleans"; "New Orleans" ]
use
关键字处理资源和
for
和
while
可以用来实现循环。序列/列表理解实际上使用
for
而不是
let!
,因为从句法的角度来看,这更有意义(并且
for
通常需要一些序列 - 尽管它可能是例如异步的)。
关于f# - F# 的 monad 实现在可用关键字数量方面是独一无二的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5996239/
使用此代码: main :: FilePath -> FilePath -> IO () main wrPath rdPath = do x FilePath -> IO() 但是当我将“main”
我有一个 QList由 QVector3D 组成.一个 QVector3D表示一个顶点或一个点。此列表还包含 STL-File 的所有顶点.问题是一个顶点在列表中多次存在。需要一个 STL 文件的唯一
如果我丢失了 android (APK) keystore 文件,我可以创建一个新的吗?我知道所有数据,例如名字、姓氏、组织、密码、有效期等。我可以使用这些数据创建相同的 keystore ,还是应该
我放置的函数很少,但无法按我的意愿运行。 slug 是根据帖子标题自动动态创建的。 Example: If a post title is "test" then the slug will be "
我想在 cassandra 中进行唯一约束。因为我希望我专栏中的所有值在我的专栏系列中都是唯一的前任:姓名拉胡尔电话123地址-abc 现在我希望这一行没有等于 rahul ,123 和 abc 的值
我在 C++ 代码中使用 #define 语句时遇到一些问题,但是我不熟悉如何在 VC++ 中处理它: >filetaint.cpp 1>.\filetaint.cpp(272) : error C2
我正在使用 PayPal IPN,我有以下问题:是否可能有两个具有相同 txn_id 和 payment_status 参数的 IPN 消息? 例如: IPN:txn_id=4BB79227HY951
就像 php 的 array_unique 函数一样: $input = array("a" => "green", "red", "b" => "green", "blue", "red"); $r
我是一名优秀的程序员,十分优秀!