Geo*_*rge 3 f# operators functor applicative
作为函数式编程的新手,我仍然不熟悉所有标准运算符.事实上,他们的定义在许多语言中都是任意的,并且这些定义在附近的源代码中是不可用的,如果有的话,使得阅读功能代码不必要地具有挑战性.
目前,我不知道WebSharper.UI.Next文档中<*>出现了什么.
如果有一个地方列出了各种功能语言的各种运营商的所有传统定义,那将是一件好事.
我同意你的观点,如果列出F#中使用的运算符的所有隐式约定,那将是一件好事.
该<*>运营商来自Haskell中,它是运营商应用型函子,其一般的签名是:Applicative'<('A -> 'B)> -> Applicative'<'A> -> Applicative'<'B>这是在.NET非法签名较高的种类不被支持.
无论如何,没有什么能阻止你为特定的Applicative Functor定义运算符,这里是选项类型的典型定义:
let (<*>) f x =
match (f, x) with
| Some f, Some x -> Some (f x)
| _ -> None
Run Code Online (Sandbox Code Playgroud)
这里的类型推断为:
val ( <*> ) : f:('a -> 'b) option -> x:'a option -> 'b option
Run Code Online (Sandbox Code Playgroud)
这相当于:
val ( <*> ) : f: option<('a -> 'b)> -> x: option<'a> -> option<'b>
Run Code Online (Sandbox Code Playgroud)
直观的解释是它在上下文中使用函数并在上下文中使用该函数的参数,然后在上下文中执行函数.
在我们的选项类型示例中,它可用于将函数应用于可能返回None值的操作的结果值:
let tryParse x =
match System.Int32.TryParse "100" with
| (true, x) -> Some x
| _ -> None
Some ((+) 10) <*> tryParse "100"
Run Code Online (Sandbox Code Playgroud)
你可以利用currying和写:
Some (+) <*> tryParse "100" <*> Some 10
Run Code Online (Sandbox Code Playgroud)
这表示如下:
(+) (System.Int32.Parse "100") 10
Run Code Online (Sandbox Code Playgroud)
但是没有抛出异常,这就是为什么它也被称为Applicatives用于模拟副作用,特别是在像Haskell这样的纯函数语言中.这是选项申请的另一个样本.
但对于不同类型有不同的用途,它列出了可以使用压缩它们如本岗位.
在F#中它没有定义,因为.NET类型系统不能以通用方式定义它,但是可以使用重载和静态成员约束,如在FsControl中,否则你将不得不通过打开特定模块手动选择不同的实例,这是FSharpx中使用的方法.