- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Kleisli 组合算子 >=>
,在 Haskell 圈子中也被称为“鱼”,在许多需要组合专用函数的情况下可能会派上用场。它有点像 >>
运算符,而不是组合简单的函数 'a -> 'b
它赋予它们一些特殊属性,可能最好表示为 'a -> m<'b>
, 其中 m
要么是类单子(monad)类型,要么是函数返回值的某些属性。
在更广泛的 F# 社区中可以找到这种做法的证据,例如在 Scott Wlaschin 的 Railway oriented programming (part 2)作为返回 Result<'TSuccess,'TFailure>
的函数的组合类型。
推断哪里有绑定(bind),哪里也有鱼,我尝试参数化规范的 Kleisli 运算符的定义 let (>=>) f g a = f a >>= g
使用绑定(bind)函数本身:
let mkFish bind f g a = bind g (f a)
module Option =
let (>=>) f = mkFish Option.bind f
let odd i = if i % 2 = 0 then None else Some i
let small i = if abs i > 10 then None else Some i
[0; -1; 9; -99] |> List.choose (odd >=> small)
// val it : int list = [-1; 9]
module Stack =
let (>=>) f = mkFish (<||) f
type 'a Stack = Stack of 'a list
let pop = function
| Stack[] -> failwith "Empty Stack"
| Stack(x::xs) -> x, Stack xs
let push x (Stack xs) = Stack(x::xs)
let apply2 f =
pop >=> fun x ->
pop >=> fun y ->
push (f x y)
val mkFish : bind:('a -> 'b -> 'c) -> f:('d -> 'b) -> g:'a -> a:'d -> 'c
没有意义。类型变量的顺序令人困惑,它过于笼统(
'a
应该是一个函数),而且我没有看到一种自然的注释方式。
最佳答案
如果没有 Higher Kinds,您将无法以自然的方式做到这一点。
鱼的签名应该是这样的:
let (>=>) (f:'T -> #Monad<'U>``) (g:' U -> #Monad<'V>) (x:'T) : #Monad<'V> = bind (f x) g
这在当前的 .NET 类型系统中无法表示,但您可以替换
#Monad
使用您的特定单子(monad),即:
Async
并在实现中使用其对应的绑定(bind)函数。
Option.(>=>)
),但是它违背了使用运算符的全部目的,我的意思是它不再是运算符。
关于f# - 在 F# 中制作鱼,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42816639/
我正在尝试用图像而不是文本替换我网站的顶级导航。到目前为止,我有这个,它将文本隐藏在屏幕外并为特定菜单项放置图像。 #menu-item-982 { 背景: url('image.png'); 文本缩
我试过在网上找到这个,但没有成功。 我正在使用 superfish 下拉菜单,我需要将顶部的 li 圆 Angular 化,但不是 li 的 ul 在里面,如果你看到这里这是测试页面,它的演示: js
我遇到了以下情况。我有一个菜单,如果将鼠标悬停在菜单上,则会出现一个子菜单,如果鼠标移出,子菜单就会消失,现在我想要以下内容,如果我单击子菜单中的一个元素,我希望子菜单加载新页面时保持打开状态。为此,
我有一个 super 鱼菜单 here我希望子菜单垂直下拉。我可以通过设置 .sf-menu.sf-style-white.sf-navbar li ul { width: 150px; le
如标题所示...我正在使用 Wordpress CSS Dropdown Menu 插件设置一个 superfish 菜单,我的父菜单项没有保持悬停的 text-shadow.. 我已经设置了一个 j
网址:http://coqinn.lexcorp.ca/rooms-and-suites/ 将鼠标悬停在 Rooms & Suites 菜单项上,您就会明白我的意思,我需要让它停止这样做。如果适当的子
我是一名优秀的程序员,十分优秀!