gpt4 book ai didi

f# - 这个 F# 运算符 <*> 的典型定义/含义是什么

转载 作者:行者123 更新时间:2023-12-01 09:19:37 25 4
gpt4 key购买 nike

作为函数式编程的新手,我仍然不熟悉所有标准运算符。事实上,它们的定义在许多语言中是任意的,而且这些定义在附近的源代码中不可用,如果有的话,这使得阅读函数式代码变得不必要地具有挑战性。

目前,我不知道 <*>因为它出现在 WebSharper.UI.Next文档。

如果有一个地方列出各种函数式语言的各种运算符的所有常规定义,那就太好了。

最佳答案

我同意你的观点,最好有一个地方列出 F# 中使用的运算符的所有隐式约定。

<*>运算符来自 Haskell,它是 Applicative Functors 的运算符,它的一般签名是:Applicative'<('A -> 'B)> -> Applicative'<'A> -> Applicative'<'B>这是 .NET 中的非法签名 higher kinds不支持。

无论如何,没有什么能阻止您为特定的 Applicative Functor 定义运算符,这是选项类型的典型定义:

let (<*>) f x =
match (f, x) with
| Some f, Some x -> Some (f x)
| _ -> None

这里类型推断为:

val ( <*> ) : f:('a -> 'b) option -> x:'a option -> 'b option

相当于:

val ( <*> ) : f: option<('a -> 'b)> -> x: option<'a> -> option<'b>

直观的解释是它在上下文中获取一个函数,并在上下文中为该函数提供一个参数,然后在上下文中执行该函数。

在我们的选项类型示例中,它可用于将函数应用于可能返回 None 的操作的结果值。值(value):

let tryParse x = 
match System.Int32.TryParse "100" with
| (true, x) -> Some x
| _ -> None

Some ((+) 10) <*> tryParse "100"

你可以利用柯里化(Currying)和写作:

Some (+) <*> tryParse "100" <*> Some 10

代表类似:

(+) (System.Int32.Parse "100") 10

但是没有抛出异常,这就是为什么 Applicatives 也被用来模拟副作用的原因,特别是在像 Haskell 这样的纯函数式语言中。这里是 another sample选项应用程序。

但是对于不同的类型,它有不同的用途,对于列表,它可以用来压缩它们,如 post 所示.

在 F# 中没有定义它,因为 .NET 类型系统无法以通用方式定义它,但是可以使用重载和静态成员约束,如 FsControl否则您将不得不通过打开特定模块手动选择不同的实例,这是 FSharpx 中使用的方法.

关于f# - 这个 F# 运算符 <*> 的典型定义/含义是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35809826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com