问题标签 [derivingvia]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
476 浏览

haskell - 如何在 Haskell 中将自定义类型转换为整数?

我正在尝试在 haskell 中使用我自己的数据类型作为素数,但我目前遇到了一些问题。

一旦我对素数进行任何数字运算(例如下面的“phi”函数),我想将结果作为整数处理,但我不知道该怎么做。

phi 应该返回一个整数,因为它不再是质数。我得到的只是预期的错误消息:

那么如何将我的自定义类型转换为整数?我对 Haskell 没有太多经验。

0 投票
1 回答
99 浏览

haskell - 派生方式:无法派生良好的实例

当我尝试派生实例时遇到此错误。

我正在尝试这样做:

您可以在第 278 行看到我基于类型并尝试在此处派生的数据类型和实例。我不习惯使用派生方式 - 谁能解释这个错误的含义以及我将如何解决它?

0 投票
0 回答
111 浏览

haskell - 如何实现将两个消费者合二为一的分叉功能

我正在尝试使用论文“Faster coroutine pipelines”中描述的抽象来构建一个流式库。我已经修改了代码,以便它正确处理管道退出(而不是在发生这种情况时抛出错误):

我想实现一个功能

这将两个消费者流合并为一个(类似于管道的ZipSink)。它应该具有以下语义:

  1. 如果两个流都没有退出并且正在接受输入,则将相同的输入值提供给两个流
  2. 如果一个流已退出,则存储返回值,然后将输入馈送到接受该值的流中
  3. 如果两个流都已退出,则将两个流的返回值放入一个元组中。

这是我的尝试:

我们重用了loop论文中连接一个InCont r m i到两个OutCont r m i并主动恢复延续的函数。

由于loop我们可以将结果管道的输入同时连接到两个管道,输出将在两个管道之间共享(这并不重要,因为你不能产生 a Void)。

现在我们只需要填写延续f,它们将在它们退出时被g调用。如果在被调用时已经被调用,这意味着已经退出,那么应该调用 continuation ,如果还没有被调用,那么应该存储返回值并恢复输入继续(通过丢弃所有传递的值)似乎对我来说,如果没有某种形式的共享状态,就不可能实现这一点。我们可以尝试使用 state monad 来存储状态:pqgfqfkgfam

sinkOk是丢弃所有输入的输出延续:

我们现在可以添加一些辅助功能进行测试:

这在p退出早于的情况下有效q

给出所需的输出:

q但是当早于 退出时,它会进入无限循环p

输出:

0 投票
3 回答
191 浏览

haskell - 是否可以在自定义类型和标准库类型之间建立强制实例?

举个简单的例子,假设我想要一个类型来表示井字游戏标记:

这与Bool

但是Coercible Bool Mark它们之间没有,即使我导入GHC.Types(我首先认为 GHC 可能需要Bool's 的定义位置才能看到),拥有这个实例的唯一方法似乎是通过newtype.

也许我可以定义newtype Mark = Mark Bool和定义双向模式NoughtCross我希望有比这更简单的东西。

0 投票
1 回答
151 浏览

haskell - 如何强制约束?

是否有任何机制可以强制 Haskell 中的约束(unsafeCoerce我希望除此之外有效)?

0 投票
3 回答
203 浏览

haskell - 是否有用于创建 [Maybe a] 模拟的语法,但有种类(* -> *)

我试图创建一个适用于[Maybe a]. 但是, Maybe a 有 kind *,而 fmap 需要 kind * -> *。这导致了以下不幸的解决方案:

不幸的是必须创建一个newtype。我希望可以创建一个适用于 的实例,适用[Maybe a]于任何a. 即,可以称为 的东西fmap f [Just 10, Nothing]

我似乎遗漏了一些语法。是否可以定义这样的实例?

0 投票
1 回答
130 浏览

haskell - 是否可以通过另一个类型构造函数派生 Traversable 实例?

假设我们有一些类Foo,这样的实例Foo f为我们提供了实现 和 所需Functor fFoldable f一切Traversable f。为了避免重叠的实例,可以在 newtype 包装器之间Foo和下面见证这种关系:Functor, Foldable, Traversable

现在假设我们有一些类型构造函数:

这样有一个:

我们想装备它的“ -ness”Bar所暗示的实例。Foo既然Bar aCoercibleto FoonessOf Bar a,我们希望能够推导出via实例FoonessOf Bar

这适用于类型类,例如FunctorFoldable

不幸的是,当我们尝试对 做同样的事情时Traversable,事情就出错了:

所以我的问题是:

  1. 是否可以通过实例提出其他一些派生方案Traversable Bar
  2. 是否有可能对Traversable可以通过新类型派生的类进行一些修改?
0 投票
1 回答
88 浏览

haskell - 为基于另一个类的类型派生一个类实例,它是一个实例

我有一种情况,我有一些类似的东西newtypes都需要是Random,Arbitrary和许多其他东西的实例。它们都需要函数、、、等的相同自定义实现。所以我将所有这些实现放在一个类中。randomRrandomarbitrary

这是一个简化的示例,仅处理Random.

这是我想要的其中一种类型的示例。

我希望这是一个实例Random。理想情况下,我想写一些类似的东西:

并让编译器知道使用中定义的方法Narrow来实现Random. 但相反,我必须写

对几种方法执行此操作不是问题,但是对我的每种类型执行Num, Fractional, RealFrac, Floating,Serialize等操作有点乏味。

我探索过的另一种方法是写

因为我只需要为班级写一次,而不是为每种类型重复一次。但这导致UndecidableInstances我理解是不好的。我可以做到这一点TemplateHaskell,我敢肯定。但我想知道是否有一些花哨的语言编译指示或类型级编程魔法可以简化这一点?

0 投票
1 回答
80 浏览

haskell - 如何为双半组制作一个容器?

我正在学习 Haskell。想象一下,我有以下内容:

我希望为Coordinate.

类型检查器对我不满意:

(我知道这只是一个双倍的空容器,我可能已经在使用双倍本身,但我正在学习 Haskell,我想了解它是如何工作的。)

0 投票
1 回答
103 浏览

haskell - 将“派生方式”与类型族一起使用

我有一个带有默认实现的类型类,如果用户想要使用他们的自定义 monad,我想提供一种简单的方法来派生类型类。

这是别人提供给我的解决方案:

如果我的类型类使用类型族,我将无法使用deriving via。例如:

最后一行没有编译:

当类型类具有类型族时,如何使派生通过子句进行编译?