函数式编程是一种基于使用函数构建抽象,避免副作用和状态变化的编程范例。纯函数编程是线程安全的。
在 Elixir 中,有一个很棒的管道操作符,其工作方式如下: “你好世界!” |> String.split(" ") |> Enum.map(&String.capitalize/1) |> 枚举.join 在 Ruby 中...
我想在 Option 的上下文中组合两个endofunctor。我想要的组合是通过 Category.compose 将两个 endofunctor 组合成一个。我发现 MonoidK[Endo].algebra[*] 实例
我有两个非常相似的函数,但打字稿只能推断其中一个的返回值: 接口 URItoKind {} 输入 URIS = keyof URItoKind; 类型 种类 我有两个非常相似的函数,但打字稿只能推断其中一个的返回值: interface URItoKind<A> {} type URIS = keyof URItoKind<any>; type Kind<URI extends URIS, A> = URItoKind<A>[URI]; const URI = "Option"; export type URI = typeof URI; interface URItoKind<A> { readonly [URI]: Option<A>; } class Option<A> { static of: <A>(a: A) => Option<A>; } function test1<F extends URIS, A, B>(f: (a: A) => Kind<F, B>): Option<B>; function test2<F extends URIS>(): <A, B>(f: (a: A) => Kind<F, B>) => Option<B>; const func = (x: number) => Option.of(x.toString()); // (x: number) => Option<string> const r1 = test1(func); // Option<unknown> - Doesn't work const r2 = test2()(func); // Option<string> - Works Fine 游乐场链接 我希望有人可以向我解释问题出在哪里。这是预期的还是错误?是否有某种解决方法可以使 test1 工作而无需手动指定类型? 这是由于 TypeScript 有时为了性能而“懒惰”的方式造成的。 测试1 function test1<F extends URIS, A, B>(f: (a: A) => Kind<F, B>): Option<B>; 一旦您调用 test1(func),TypeScript 就会尝试推断类型。问题是 TS 采用 F extends URIS 并用它来推断 Kind<F, B>。 TypeScript 在某些情况下会针对性能进行优化,在这种情况下,TypeScript 会变得“懒惰”,以便更快地推断类型。 测试2 function test2<F extends URIS>(): <A, B>(f: (a: A) => Kind<F, B>) => Option<B>; 在这种情况下,你必须打电话。第一次调用会触发 TypeScript 尝试推断 F,但没有足够的信息,因此 TypeScript 会等到第二次调用。在第二次调用中,没有像 F extends URIS 这样的“提示”,因此 TypeScript 推断出 F,但这一次它不会以懒惰的方式执行此操作。它会遍历所有通用类型,直到找到真正的答案。 解决方案 您可以消除通用约束F extends URIS以防止打字稿“懒惰”,而不提示意味着TS需要一直向下推断类型。 declare function test1<A, B>(f: (a: A) => Kind<URIS, B>): Option<B>; declare function test2(): <A, B>(f: (a: A) => Kind<URIS, B>) => Option<B>; 现在两者都按预期工作: const func = (x: number) => Option.of(x.toString()); // (x: number) => Option<string> const r1 = test1(func); // Option<string> - Works Fine const r2 = test2()(func); // Option<string> - Works Fine
如何使用高阶转换器函数自动推断 TypeScript 函数管道中的类型?
我正在构建一个模拟器,其中使用 fp-ts 中的管道通过各种函数逐步转换对象。为了使代码更具表现力,我使用高阶函数来创建...
Haskell 不允许改变全局变量,这是动态编程的关键概念,所以我想出了一个解决方案。 这依赖于 Haskell 的惰性求值和无限列表 难道我...
Haskell 和其他函数式编程语言都是围绕不维护状态的前提构建的。 我对函数式编程的工作原理和其中的概念仍然很陌生,所以我想知道我......
这个节目 {-# 语言 LambdaCase #-} 导入 Control.Concurrent (threadDelay) 导入 Control.Concurrent.Async (withAsync) 导入 Control.Exception(最后) 导入 Control.Monad(永远) 主要...
我知道一个问题,即 C++ 中闭包的行为与其他编程语言不同(它们扩展了捕获变量的生命周期并具有 GC) 如果我们写这样的代码 自动发电机()...
我已经完成了一些函数式编程,并且有一些在线参考资料,所以我发现基本的 Erlang 编程非常简单。 但由于我做了更多的过程/面向对象的编程...
我正在寻找一种根据元组出现的次数来过滤一组(或列表)元组的方法。 项目出现在元组的另一个位置之一中。 我当前的目标有点复杂,所以我划分...
我正在尝试基于 CoqExtLib 中定义的有限映射来执行以下证明。但是,我遇到了一个问题,证明中显示的 RelDec 实例与实例不同......
我目前正在通过用python编写monad库来自学函数式编程。我在类型提示方面遇到了麻烦。例如,Haskell 中有一个带有签名的函数 filterM...
我是Scheme的新手,已经使用麻省理工学院的Scheme有一段时间了。我试图了解如何实现流行的图算法,例如最短路径算法、BFS、DFS。有教程吗
为什么以下不起作用? A b1 = 新 B(); 函数函数 = x -> new B(); A apply = function.apply(b1); 它给出一个错误“需要类型捕获?...
所以我曾经能够运行多个断言,但现在我不断收到警告“未使用的表达式没有副作用”。然而,每个断言本身都通过了测试...
如果我们绑定两个解析器并且第二个解析器失败,字符串是否会被解析一次?
所以假设这是一个解析器: 数据解析器 a = MkParser (String -> Maybe (String, a)) runParser :: 解析器 a -> 字符串 -> 也许 a runParser (MkParser sf) inp = case sf inp of ...
好的,我有这个解析器和数据: 模块 SO 其中 导入数据.Char import Prelude 隐藏 (fmap, (>>=), (*>), (<*), pure) data Parser a = MkParser (String -> Maybe (String, a)) 数据...
我的代码是这样的: -- 我的解析器采用一个函数,该函数采用字符串并给出 -- 后缀和答案 数据解析器 a = MkParser (String -> Maybe (String, a)) unParser :: 解析器 -...
如果我有这样的列表: [我;我;我;a;b;b;a;我;我;c] (*最长的重复序列是 [i;i]*) [我;我;我;我] (*此处 max_pattern 为 [i;i] (必须重复,无重叠*) [t;f;f;t] (*...
这是我的解析器,以及运行解析器的两个函数: 数据解析器 a = MkParser (String -> Maybe (String, a)) unParser :: 解析器 a -> String -> Maybe (String, a) 解解析器 (MkParser a) 我...