问题标签 [deriving]
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.
class - 有没有办法在 Haskell 中以自己的数据类型派生 Num 类函数?
假设我有一个类型声明:
我希望能够尽可能将 MyType 视为 Double,所有 Num、Real、Fractional 函数导致 N(正常结果)用于包装在 N 构造函数中的参数,以及占位符用于其他参数
除了以类似于以下方式简单地将此类定义为这些类的实例之外,还有其他方法可以做到这一点:
(这似乎适得其反)?
haskell - 提升的自动haskell派生声明
有没有办法让编译器派生我手动编写的功能:
即,当一种类型的类Class
被包装时Trans
,是否可以自动获得Class
for的免费实例Trans
而无需进行繁重的工作:)?
haskell - 组合两个单子变压器堆栈时无法派生 Applicative
我已经为我正在开发的特定领域的语言编写了两个 monad。第一个是Lang
,它应该包括逐行解析语言所需的所有内容。我知道我需要 reader、writer 和 state,所以我使用了RWS
monad:
第二个是Repl
,它使用Haskeline与用户交互:
两者似乎都可以单独工作(它们编译并且我已经在 GHCi 中尝试过它们的行为),但是我无法嵌入Lang
到Repl
解析用户的行中。主要问题是,我该怎么做?
更具体地说,如果我写Repl
的内容包括Lang
我最初打算的方式:
它主要是类型检查,但我无法派生Applicative
(Monad
其他所有内容都需要)。
由于我是 monad 转换器和设计 REPL 的新手,我一直在Glambda和. 我最初选择它是因为我也会尝试使用 GADT 来表达我的表达。它包括一些我已经采用但完全愿意改变的不熟悉的做法:Repl.hs
Monad.hs
newtype
+GeneralizedNewtypeDeriving
(这很危险吗?)MaybeT
允许退出 REPLmzero
到目前为止,这是我的工作代码:
还有一些人试图扩展它。首先,包括Lang
在Repl
上面提到的:
接下来,尝试同时使用它们:
lift
未显示:我还尝试了on the ask
andputStrLn
调用的各种排列。最后,为了确保这不是 RWS 特有的问题,我尝试在Lang
没有它的情况下编写:
这给出了相同的 eta-reduce 错误。
所以回顾一下,我想知道的主要事情是我如何结合这两个单子?我是否遗漏了一个明显的lift
s 组合,或者错误地安排了变压器堆栈,或者遇到了一些更深层次的问题?
以下是我查看的几个可能相关的问题:
更新:我对 monad 转换器的粗浅理解是主要问题。可以在两者之间插入usingRWST
而不是RWS
so并主要解决它:LangT
Repl
IO
剩下的唯一问题是我需要弄清楚如何制作Repl2
实例 io MonadIO
。
更新 2:现在一切都好!只需要添加MonadTrans
到为LangT
.
c++ - 如果您的类派生自 unique_ptr,如何调用基本构造函数
如何通过调用它的超类来实现具有 T 类型参数的 SearchTree 构造函数?
parsing - 我可以将此推导视为最左或/和最右吗?
例如,我想从给定的生产集中派生字符串“aabbccdd”:
我可以使用最左边和最右边的推导从 AB 推导出字符串。
但是从 C 开始呢?在派生字符串时,我总是只有一个变量。
从 C 推导:
使用了什么样的推导,我可以认为这种语法模棱两可吗?
haskell - 自动为没有 TH 的新类型派生 Unbox
所以我有一个非常基本的新类型:
而且我想在未装箱的向量中使用这种类型,但是在第一次检查时,这似乎比推导...说...更复杂Storable
。当我说“派生”时,理想情况下,我希望通过自动派生。GeneralizedNewtypeDeriving
当我查看vector
库对默认类型的派生时,我看到了这个。
此外,在搜索网络时,我遇到了这篇建议使用来解决问题的SO 帖子。Template Haskell
我目前没有使用 TH,最好不要被迫走这条路。
我在这里要做的只是拥有一个在语义上与原始类型正交的否则无法装箱的数据类型,因为我想在我的 API 中使用智能构造函数。有没有什么方法可以让这种类型无法装箱而不需要Template Haskell
使用大量的样板?这似乎可以在给定的情况下一般派生的东西newtype
只会在编译时被删除。理想情况下,我只想这样做:
现在,当我尝试使用上述方法自动推导时,出现此错误:
如果我使用GeneralizedNewtypeDeriving
而不是DeriveAnyClass
,我会收到关于类型家族角色的更长的错误消息,我假设这在历史上一直是使这种技术成为现实的问题。有什么改变吗?
haskell - 读取自定义数据类型失败
我只是MyNum
用构造函数定义One
,Two
和Three
。
*主要> :t 一
一 :: MyNum
x = read("One")::MyNum
但是当我添加到我的程序时 ghci 会产生错误:
没有使用 'read' 产生 (Read MyNum) 的实例</p>
在表达式中: read ("One") :: MyNum
在 'x' 的等式中: x = read ("One") :: MyNum
为什么我做不到read
?
haskell - 派生具有更多类型变量的 newtype
我有这些新类型。前三个按预期工作,但第四个给出:
我不明白问题出在哪里。在我看来,第二种新类型严格来说更一般,因此必须遇到同样的问题。那么如果MyNewtype2
能推导出Eq,为什么MyNewtype2
不能呢?这可能是最让我困惑的地方。有人可以向我解释一下吗?另外,如果我想要这样的新类型,首选的解决方案是什么?
haskell - 派生包含数据结构时未使用类型类实例
我一直在探索newtype
在我的代码中使用更多的包装器来制作更多不同的类型。我还使用 Read/Show 进行了很多廉价的序列化,特别是作为强类型配置文件的简单形式。我今天遇到了这个:
这个例子是这样开始的,我定义了一个简单的 newtype 来包裹 Int,以及一个用于展开的命名字段:
自定义实例从简单的 Int 语法中读取其中之一。这里的想法是能够将“42”放入配置文件而不是“Bar { unBar = 42 }”会很棒
该实例还具有跟踪“日志记录”,因此我们可以在观察问题时查看该实例何时真正使用。
现在是另一种包含 Bar 的类型。这将只是自动派生读取。
单独反序列化 Bar 类型可以正常工作并使用上面的 Read 实例
但是出于某种原因,包含 Bar 并自动派生到 Read 的 Foo 并没有深入挖掘并拾取 Bar 的实例!(请注意,也不会显示来自跟踪的调试消息)
那么好吧,Bar 的默认 Show 表单怎么样,应该与默认的 Read 匹配吗?
不!也不行!!同样,没有调试消息。
这是执行输出:
这对我来说看起来很麻烦,但我很想听到我做错了。
提供了上述代码的完整工作示例。在 darcshub 上src/Main.lhs
的测试项目中查看该文件