我需要将编译脚本中的一些信息传递给Template Haskell.目前编译脚本将信息保存在系统环境中,所以我只是使用System.Environment.getEnvironmentwrap in来读取它runIO.有没有更好的方法,例如传递一些参数ghc(类似于-D...C预处理器),或者也许是为TH专门为此目的而设计的东西?
到目前为止,我遇到的每个monad(可以表示为数据类型)都有相应的monad变换器,或者可以有一个.有这样一个不能有一个单子吗?或者所有monad都有相应的变压器?
通过对应于monad的变换器t,m我的意思t Identity是同构的m.当然,它满足monad变压器法则,并且t n是任何monad的monad n.
我希望看到每个monad都有一个证明(理想情况下是建设性的证明),或者没有一个证明(带证明)的特定monad的例子.我对更多面向Haskell的答案以及(类别)理论答案感兴趣.
作为后续问题,是有一个单子m是有两个不同的变压器t1和t2?也就是说,t1 Identity同构t2 Identity和m,但有一个单子n这样t1 n是不是同构t2 n.
(IO并且ST有一个特殊的语义,所以我不在这里考虑它们,让我们完全忽略它们.让我们只关注可以使用数据类型构造的"纯"monad.)
在我们的项目中,我们有很多TH生成的函数.向它们添加通用注释是有意义的,以便它们在Haddock/Hoogle中可见.至少,像"这是由TH生成的".有可能吗?
GHC如何处理多个线程(显式线程或评估spark的内部线程)访问的thunk?是否会发生多个线程评估同一个thunk,重复工作?或者,如果thunks同步,如何,这样性能不会受到影响?
Git提供了这4种差异算法,但没有任何进一步的信息,它们的区别是什么.
每种算法有哪些优点?是否存在算法执行方式不同的各种情况的比较?
我已经看到提到IO不满足monad定律,但我没有找到一个简单的例子来证明这一点.有人知道一个例子吗?谢谢.
编辑:正如ertes和nm指出的那样,使用seq有点非法,因为它可以使任何monad失败的法律(结合undefined).由于undefined可以将其视为非终止计算,因此使用它完全没问题.
所以修改后的问题是:任何人都知道一个例子表明IO未能满足monad法则,而不使用seq?(或者,IO如果seq不允许,可能会出现符合法律规定的证据?)
我正在研究接收和处理JSON请求的Haskell守护程序.虽然守护进程的操作很复杂,但主要结构有意保持简单:它的内部状态只是IORef一个数据结构,所有线程都对此执行原子操作IORef.然后有几个线程在触发器上取值时用它做一些事情.
问题是守护进程泄漏了内存,我无法找到原因.它肯定与请求相关:当守护进程每秒收到多个请求时,它会泄漏大小为1MB/s(由Linux工具报告).内存消耗稳步增长.没有请求,内存消耗保持不变.
令我感到困惑的是,这些都没有在GHC分析中显示出来.要么我在配置文件参数中缺少某些内容,要么内存被其他内容消耗:
运行+RTS -hc -xt -p:

运行+RTS -hr -xt -p:

在此测试运行期间,守护程序随后消耗超过1GB.因此,分析数据显然与实际消耗的内存数量级不对应.(我知道RTS,GC和性能分析本身会增加实际内存消耗,但这种差异太大了,并不符合不断增加的消耗.)
我已经尝试rnf了守护进程内的所有状态数据IORef,以及解析的JSON请求(以避免部分JSON字符串保留在某处),但没有太大的成功.
欢迎任何想法或建议.
更新:守护程序没有运行-threaded,因此没有操作系统级别的线程.
GC统计信息更接近堆分析而不是Linux报告的数字:
Alloc Copied Live GC GC TOT TOT Page Flts
bytes bytes bytes user elap user elap
[...]
5476616 44504 2505736 0.00 0.00 23.21 410.03 0 0 (Gen: 0)
35499296 41624 2603032 0.00 0.00 23.26 410.25 0 0 (Gen: 0)
51841800 46848 2701592 0.00 0.00 23.32 410.49 0 0 (Gen: …Run Code Online (Sandbox Code Playgroud) 在我的空闲时间,我正在学习Haskell,所以这是一个初学者的问题.
在我的阅读中,我遇到了一个例子,说明如何Either a成为一个实例Functor:
instance Functor (Either a) where
fmap f (Right x) = Right (f x)
fmap f (Left x) = Left x
Run Code Online (Sandbox Code Playgroud)
现在,我试图理解为什么实现在Right值构造函数的情况下映射,但是在不是的情况下Left?
这是我的理解:
首先让我重写上面的例子
instance Functor (Either a) where
fmap g (Right x) = Right (g x)
fmap g (Left x) = Left x
Run Code Online (Sandbox Code Playgroud)
现在:
我知道 fmap :: (c -> d) -> f c -> f d
如果我们替换f,Either a我们得到fmap :: (c -> d) -> Either …
有没有办法设置某些标志是强制性的,还是我必须自己检查它们的存在?
Alternative,的扩展Applicative,声明empty,<|>这两个功能:
一个或多个:
Run Code Online (Sandbox Code Playgroud)some :: f a -> f [a]零或更多:
Run Code Online (Sandbox Code Playgroud)many :: f a -> f [a]如果定义,
some并且many应该是方程的最小解:Run Code Online (Sandbox Code Playgroud)some v = (:) <$> v <*> many v many v = some v <|> pure []
我找不到一个实例some和many定义的实例.它们的含义和实际用途是什么?他们一直在使用吗?我只是从这个定义中无法理解他们的目的.
更新:我不是在问什么是什么Alternative,只是什么some和many