functional-programming 相关问题

函数式编程是一种基于使用函数构建抽象,避免副作用和状态变化的编程范例。纯函数编程是线程安全的。

Ruby 中类似 Elixir 的管道来处理集合

在 Elixir 中,有一个很棒的管道操作符,其工作方式如下: “你好世界!” |> String.split(" ") |> Enum.map(&String.capitalize/1) |> 枚举.join 在 Ruby 中...

回答 2 投票 0

如何更改幺半群以选择endofunctor?

我想在 Option 的上下文中组合两个endofunctor。我想要的组合是通过 Category.compose 将两个 endofunctor 组合成一个。我发现 MonoidK[Endo].algebra[*] 实例

回答 1 投票 0

打字稿类型推断未按预期工作

我有两个非常相似的函数,但打字稿只能推断其中一个的返回值: 接口 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

回答 1 投票 0

如何使用高阶转换器函数自动推断 TypeScript 函数管道中的类型?

我正在构建一个模拟器,其中使用 fp-ts 中的管道通过各种函数逐步转换对象。为了使代码更具表现力,我使用高阶函数来创建...

回答 1 投票 0

Haskell 中的动态编程。这是正确的方法吗(?)

Haskell 不允许改变全局变量,这是动态编程的关键概念,所以我想出了一个解决方案。 这依赖于 Haskell 的惰性求值和无限列表 难道我...

回答 1 投票 0

动态规划算法如何在惯用的 Haskell 中实现?

Haskell 和其他函数式编程语言都是围绕不维护状态的前提构建的。 我对函数式编程的工作原理和其中的概念仍然很陌生,所以我想知道我......

回答 2 投票 0

如何在用户输入时“抑制”主线程并发的“永远运行”操作?

这个节目 {-# 语言 LambdaCase #-} 导入 Control.Concurrent (threadDelay) 导入 Control.Concurrent.Async (withAsync) 导入 Control.Exception(最后) 导入 Control.Monad(永远) 主要...

回答 1 投票 0

如何在C++中重用“闭包生成器”?

我知道一个问题,即 C++ 中闭包的行为与其他编程语言不同(它们扩展了捕获变量的生命周期并具有 GC) 如果我们写这样的代码 自动发电机()...

回答 1 投票 0

Erlang:做得很好

我已经完成了一些函数式编程,并且有一些在线参考资料,所以我发现基本的 Erlang 编程非常简单。 但由于我做了更多的过程/面向对象的编程...

回答 3 投票 0

Python:基于基数属性的过滤器集/元组列表

我正在寻找一种根据元组出现的次数来过滤一组(或列表)元组的方法。 项目出现在元组的另一个位置之一中。 我当前的目标有点复杂,所以我划分...

回答 1 投票 0

Coq Proof 中使用了错误的类型类实例

我正在尝试基于 CoqExtLib 中定义的有限映射来执行以下证明。但是,我遇到了一个问题,证明中显示的 RelDec 实例与实例不同......

回答 1 投票 0

是否可以在Python中正确键入提示filterM函数?

我目前正在通过用python编写monad库来自学函数式编程。我在类型提示方面遇到了麻烦。例如,Haskell 中有一个带有签名的函数 filterM...

回答 1 投票 0

Scheme 中的图形编程

我是Scheme的新手,已经使用麻省理工学院的Scheme有一段时间了。我试图了解如何实现流行的图算法,例如最短路径算法、BFS、DFS。有教程吗

回答 4 投票 0

使用通配符泛型时无法识别基类

为什么以下不起作用? A b1 = 新 B(); 函数函数 = x -> new B(); A apply = function.apply(b1); 它给出一个错误“需要类型捕获?...

回答 1 投票 0

添加多个断言时,我不断收到未使用的表达式,没有副作用

所以我曾经能够运行多个断言,但现在我不断收到警告“未使用的表达式没有副作用”。然而,每个断言本身都通过了测试...

回答 1 投票 0

如果我们绑定两个解析器并且第二个解析器失败,字符串是否会被解析一次?

所以假设这是一个解析器: 数据解析器 a = MkParser (String -> Maybe (String, a)) runParser :: 解析器 a -> 字符串 -> 也许 a runParser (MkParser sf) inp = case sf inp of ...

回答 1 投票 0

如何用运算符解析CFG

好的,我有这个解析器和数据: 模块 SO 其中 导入数据.Char import Prelude 隐藏 (fmap, (>>=), (*>), (<*), pure) data Parser a = MkParser (String -> Maybe (String, a)) 数据...

回答 1 投票 0

如何正确地进行递归解析?

我的代码是这样的: -- 我的解析器采用一个函数,该函数采用字符串并给出 -- 后缀和答案 数据解析器 a = MkParser (String -> Maybe (String, a)) unParser :: 解析器 -...

回答 1 投票 0

在列表中找到最长的重复序列

如果我有这样的列表: [我;我;我;a;b;b;a;我;我;c] (*最长的重复序列是 [i;i]*) [我;我;我;我] (*此处 max_pattern 为 [i;i] (必须重复,无重叠*) [t;f;f;t] (*...

回答 1 投票 0

将解析器放在“盒子”中与不使用解析器有什么区别?

这是我的解析器,以及运行解析器的两个函数: 数据解析器 a = MkParser (String -> Maybe (String, a)) unParser :: 解析器 a -> String -> Maybe (String, a) 解解析器 (MkParser a) 我...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.