问题标签 [classy-prelude]
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.
haskell - Classy-Prelude (head . head)
我正在尝试将几个项目转换classy-prelude
为目前。虽然大多数行为对我来说似乎很简单,但(head . head)
在简单的 2D 列表中会出现神秘错误。
考虑以下 GHCi 会话:
ghci -XNoImplicitPrelude
让我们用and试试这个classy-prelude
:
我假设 GHC 根本无法正确解析多维列表的类型。有什么办法可以帮助它而不求助于它(Prelude.head . Prelude.head)
?
haskell - 有没有一种方便的方法来使用单遍历构造更大的类型级别的皮亚诺数?
mono-traversable 包对MinLen
. 我可以使用链式Succ
s 构造它们:
但这很快就会失控:
有没有一种方便的方法来构造更大的 Peano 数?我看到 GHC 有一个 TypeLiterals 扩展,但我不确定我是否可以在这里使用它。或者,我可以制作同义词,例如:
等等; 类似的东西是否已经存在于某个地方?
haskell - Yeson.json.object 应用于太多参数
抛出错误,
object
不在前奏范围内。哪个包/模块定义了这个?为什么在上述情况下不取键值对?
haskell - 无法理解为什么我的类型的 MonoFoldable 无法编译,或者错误消息
我有以下代码:
但是,我从编译器收到以下错误,我无法理解其含义:
据我所知,我的想法似乎是有道理的——毕竟,aRuleSet
只是Rule
s 的容器,它应该允许可折叠性,但有问题的错误消息对我来说没有任何意义。有人可以澄清我在这里未能掌握的内容吗?
haskell - MonoFoldable 我们有什么损失吗?
mono-traversable包中的MonoFoldable似乎能够实现所有常见的可折叠容器等等,例如,Bytestring
可以制作同质元组之类的东西,MonoFoldable
但不能Foldable
。我的问题是,除了需要一些高级 GHC 功能之外,我们是否会丢失任何我们MonoFoldable
没有的东西,这使得它对于例如编写者来说稍微有点棘手,并且可能会得到更丑陋的错误消息?Foldable
例如,是否有一些代码在使用Foldable
编译时MonoFoldable
没有推断出类型?或者其他任何使客户端(不是实例编写器代码)比比简单得多的Foldable
东西MonoFoldable
?
haskell - 经典前奏中 Prelude 的迭代功能有什么替代品吗?
在标准前奏中:
然而,在经典的前奏中没有迭代,所以我认为可能有一些更通用的函数来做同样的事情,也许是一个单子函数。我只是无法弄清楚它是什么。有吗?
haskell - 新类型派生 IsSequence
我有一个 newtype X
,它基本上是一个整数列表。我使用 ClassyPrelude 而不是标准 Prelude 并希望派生 IsSequence 类。这使得也有必要派生许多其他类。
语言扩展 GeneralizedNewtypeDeriving 应该允许这样做(这里与 DerivingStrategies 扩展一起使用)。我想:
完整文件:
(所有其他语言扩展似乎都很重要)
MonoTraversable
但是,这会为and产生很多错误消息IsSequence
:
我无法阅读(也许它与默认签名有关?,不知道......)。从派生子句中省略 2 个类会使代码编译。
问题:在这种情况下如何推导出 IsSequence?
出于多种原因,我的用例无法使用类型别名,但我想使用这些类提供的功能。如果无法派生,则有必要自己实现类方法。
haskell - 如何在 Haskell 中记录所有异常?
原标题:检查所有异常时如何处理多个异常类型实例?
我有以下导入(注意我的前奏实际上是 ClassyPrelude,它使用UnliftIO.Exception)。请注意, System.Logger 来自tinylog ,它是fast-logger之上的一个精简库。
以及以下功能:
将 lambda 放入具有类型的本地函数可能会使其更加清晰:
这会导致以下编译错误:
最令人担忧的是plus 30 instances involving out-of-scope types
。我可以隐藏这些导入以稍微改善这种情况:
但是,通过这种方式找到所有 30 多种异常类型并将它们全部屏蔽似乎并不合理。我假设我在这里做错了什么,或者我真的需要经历并掩盖一切吗?
注意:
- 我的
logIt
函数只是log
tinylog 函数的一个薄包装 - 随意替换任何符合人体工程学的东西。
haskell - 如何理解 `MonadUnliftIO` 的“无状态单子”要求?
我查看了https://www.fpcomplete.com/blog/2017/06/tale-of-two-brackets,虽然略读了一些部分,但我仍然不太了解核心问题“StateT
很糟糕,IO
是好的”,除了模糊地感觉到 Haskell 允许人们编写糟糕的StateT
monad(或者在文章的最终示例中,我认为MonadBaseControl
不是)。StateT
在黑线鳕中,必须满足以下定律:
所以这似乎是说m
在使用askUnliftIO
. 但在我看来,在 中IO
,整个世界都可以是状态。例如,我可能正在读取和写入磁盘上的文本文件。
引用迈克尔的另一篇文章,
虚假纯度 我们说 WriterT 和 StateT 是纯粹的,从技术上讲它们是纯粹的。但说实话:如果您有一个完全存在于 StateT 中的应用程序,那么您将无法从纯代码中获得您想要的受限突变的好处。不妨直言不讳,并接受您有一个可变变量。
这让我认为情况确实如此:对于 IO,我们是诚实的,对于StateT
,我们对可变性并不诚实……但这似乎是另一个问题,而不是上面的法律试图表明的;毕竟MonadUnliftIO
是假设IO
。我很难从概念上理解如何IO
比其他东西更具限制性。
更新 1
睡觉后(一些),我仍然很困惑,但随着时间的推移,我逐渐变得越来越少。我为IO
. 我意识到id
README 中的存在。尤其是,
所以askUnliftIO
似乎会返回IO (IO a)
一个UnliftIO m
.
m
回到法律上,当在转换后的 monad ( ) 上进行往返时,状态似乎在 monad 中没有发生突变askUnliftIO
,其中往返是unLiftIO
-> liftIO
。
继续上面的例子barIO :: IO ()
,所以如果我们这样做barIO >>= (u -> liftIO (unliftIO u m))
,那么u :: IO ()
和unliftIO u == IO ()
,那么liftIO (IO ()) == IO ()
。**因此,由于一切基本上都是幕后的应用程序id
,我们可以看到没有更改任何状态,即使我们正在使用IO
. 至关重要的是,我认为,重要的是 in 的值a
永远不会运行,也不会因为使用askUnliftIO
. 如果确实如此,那么就像在 的情况下一样,如果randomIO :: IO a
我们不运行它,我们将无法获得相同的值askUnliftIO
。(下面的验证尝试1)
但是,看起来我们仍然可以对其他 Monad 做同样的事情,即使它们确实保持状态。但我也看到,对于某些 monad,我们可能无法做到这一点。考虑一个人为的例子:每次我们访问a
包含在有状态 monad 中的类型的值时,都会改变一些内部状态。
验证尝试 1
到目前为止很好,但对为什么会发生以下情况感到困惑:
haskell - 如何使用异常处理在 Haskell 中编写“retryForever”函数?
我想创建一个可以从尽可能多的错误中恢复的函数,然后再试一次。当然,有意义的错误处理包含在程序的其他部分——这是保持运行的最后努力。所以我写了这个:
然后我将我的主要 IO 操作包装在retryForever
:
在我程序的另一部分(可能是不同的绿色线程)中,我使用以下方法进行测试:
导致:
(并且程序死亡而不是继续)
请注意,我使用的是经典前奏,用于可能很重要的情况,例如catchAny
不处理那里的异步异常,这很可能是这里的问题。