问题标签 [tagless-final]

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 投票
1 回答
260 浏览

scala - 使用代数验证和捕获错误

我在媒体上看到了这篇文章:https ://medium.com/@odomontois/tagless-unions-in-scala-2-12-55ab0100c2ff 。有一段代码我很难理解。文章的完整源代码可以在这里找到:https ://github.com/Odomontois/zio-tagless-err 。

代码是这样的:

以下是我的问题:

  • 鉴于类型是在对象中声明的,scala 编译器如何解决/处理任意类型?它似乎取决于 apply 方法参数类型,但是这与 Capture 是一个对象并且您可以有多个不同类型的 apply 调用这一事实有何关系?我遇到了这篇文章,对象中没有定义的类型声明是什么意思?但我仍然不清楚。
  • 根据文章,上面的代码使用了另一个库https://github.com/alexknvl的技巧。您能否解释一下这种模式背后的想法是什么?它是干什么用的?我了解作者使用它是为了捕获登录过程中可能发生的多种类型的错误。

谢谢!

更新:

第一个问题:

根据规范,当上限缺失时,假定为 Any。因此,Arbitrary 被视为 Any,但是,它似乎与 Any 不可互换。

这编译:

但是,这不会:

另请参阅此 scala益智游戏

0 投票
1 回答
220 浏览

scala - 在 Scala Tagless Final、隐式、单元测试中找不到隐式

得到:

不知道为什么。

我正在尝试使用 Tagless Final 来理解单元测试

所以我有:

在我的单元测试中,我有:

完整代码:https ://bitbucket.org/jameskingconsulting/scala-effects/src/master/

0 投票
2 回答
456 浏览

scala - 我的 Tagless Final 课程中 Cats FlatMap 的问题

我有以下课程:

在这个类中,我有一个功能:

据我了解,这应该有效:

但它抛出:cannot resolve symbol flatMap

我想念什么?

0 投票
0 回答
170 浏览

haskell - 带有 RValue LValue 问题的无标签最终 DSL

Typed Tagless Final Interpreters免费 monad方法的有趣替代方案。

但是,即使在无标记最终样式中使用了一个非常简单的ToyLang示例,也会弹出模棱两可的类型变量。

ToyLang是一个 EDSL,应该是这样的:

总的目标当然是在这个 EDSL 中尽可能使用 Haskell 类型系统,并使用多态来实例化各种解释器。

(.+)如果没有导致左值和右值概念的操作,一切都会好起来的:赋值运算符(.=)在其左侧有一个左值,在其右侧有一个左值或右值。基本思想取自Impredicative Polymorphisms, a Use Case中的两条评论:

一个漂亮的“解释器”会这样开始:

小帮手toString必须从 GADT 的总和中挖掘出值:

智能构造函数num很简单

麻烦有(.+)两个原因:

  1. (.+)不在 monad 中,m因为否则我们无法编写a .= a + num 1,但是Writer String例如,为了tell.

  2. 类型检查器对(.+) :: Expr lr -> Expr lr' -> Expr R. 很明显,如果没有进一步的注释,它就无法确定是指哪个实例。但是,如果可能的话,注释这样的子句a .= a .+ num 1会使 DSL 变得非常笨拙。

使类型工作的一种方法是在(.+)某种程度上进入 monad,并且(.=),也:

不过,这一切都很奇怪:

  • (.=)并且(.+)在他们需要monad的地方和不需要的地方是不对称的m

  • 即使在Writer Stringmonad 中,我也被迫进行整数运算以创建m (Expr R)返回类型,尽管实际上并不需要结果

  • 实例ToyLang化为 aWriter String看起来很整洁,但并没有真正完成这项工作。a .= a .+ num 1不能如此漂亮地打印,因为a .+ num 1.=.

我觉得这在某种程度上都是错误的。有一个更好的方法吗?

这个ToyLang例子的源代码在github 上

参考:

0 投票
1 回答
599 浏览

scala - 在余代数上使用 Tagless Final(对象代数)可以吗?

0 投票
1 回答
678 浏览

scala - Scala,猫 - 如何使用 IO(或其他 monad)和 Either 创建无标记的最终实现?

我创建了一个简单的trait和他的实现:

在这里,我想使用EitherorEitherT来“捕捉”错误,但我也想使用IOorFuture作为主要的单子。在我的主类中,我创建了对此实现的调用:

但是在pointer创建的行中,IntelliJ 向我显示了一个错误:Type mismatch - required: UserRepositoryAlg[F], found: UserRepositoryInterpreter我不明白为什么。我用as 创建了一个Pointer类,并想使用. 我该如何解决这个问题或者在这种情况下有什么好的做法?如果我想实现这样的目标:或.F[_]IOUserRepositoryAlg[F]IO[Either[Error, User]]EitherT[IO, Error, User]

我试图改变class UserRepositoryInterpreter extends UserRepositoryAlg[Either[Error, *]]成类似的东西class UserRepositoryInterpreter[F[_]] extends UserRepositoryAlg[F[Either[Error, *]]],但它对我没有帮助。

编辑: 我发现了如何F[Either[Error,User]]使用Applicative[F]which transform返回A => F[A]

但是我在 main 函数中仍然存在问题,因为我无法获得以下RightEither

这里updated <- EitherT.rightT(repo.update(user)) userEither[Error, User],但我只需要通过User。所以我尝试做类似的事情: Right(user).map(u=>u)并通过它,但它也无济于事。我应该如何取这个值?

0 投票
1 回答
640 浏览

scala - 使用无标签最终更改为错误的优雅方式

我经常做这样的事情:

简而言之,这意味着 if Eitheris leftthen use raiseError,如果它right只是返回值。

有没有更方便的“解包” Either方式?

0 投票
1 回答
532 浏览

scala - 使用 Async[F] 将 Future[A] 转换为 F[A]

我正在与 Slick 和 Cats 合作。

database.run返回 a Future,但我需要我的类的方法(泛型 on F[_]: Async)返回 monad F。我可以让它像这样工作

但这肯定不是应该这样做的方式,因为它阻塞了线程。

有没有合适的方法来做到这一点?

0 投票
1 回答
67 浏览

haskell - 一个函数中的两个多态类

我有这个带有状态单子的代码:

我试图按照这种方法使用多态类型类来概括它:https ://serokell.io/blog/tagless-final 。

我可以概括 ModelData:

但是,当我尝试同时使用 ModelData 和 ClientData 时,它无法编译:

错误:

我可以用这种方式编译它,但它似乎与我试图概括的原始代码不同:

我非常感谢您的建议。谢谢!

0 投票
1 回答
80 浏览

haskell - 一个函数中两个多态类的解释器

我有这个多态代码(见这个问题),带有用于模型和客户端的通用单子:

这是通过 Writer monad 解释日志中操作的漂亮打印解释器Client

的翻译Model很难。我尝试了几件事,每件事都会导致自己的错误:

  1. “无法匹配类型‘c’”:
  1. “`不能将'Printer a'类型的表达式应用于可见类型参数'(Printer a)'”:
  1. “无法将类型 'c' 与 'WriterT [String] Data.Functor.Identity.Identity' 匹配”

不知何故,我需要告诉现在c a是什么。actPrinter a

也许我需要在模型类中有两个参数——m模型单子和c客户端单子,模型类也应该定义函数clientToModel :: c a -> m a

有没有办法让模型和客户端解耦?我可能还需要clientToModel :: c a -> m a每一对?

我很感激这个建议。谢谢!