小编Pet*_*lák的帖子

如何正确地将编译时信息传递给Template Haskell函数?

我需要将编译脚本中的一些信息传递给Template Haskell.目前编译脚本将信息保存在系统环境中,所以我只是使用System.Environment.getEnvironmentwrap in来读取它runIO.有没有更好的方法,例如传递一些参数ghc(类似于-D...C预处理器),或者也许是为TH专门为此目的而设计的东西?

haskell compile-time template-haskell

69
推荐指数
2
解决办法
1942
查看次数

是否有monad没有相应的monad变压器(IO除外)?

到目前为止,我遇到的每个monad(可以表示为数据类型)都有相应的monad变换器,或者可以有一个.有这样一个不能有一个单子吗?或者所有monad都有相应的变压器?

通过对应于monad变换器t,m我的意思t Identity是同构的m.当然,它满足monad变压器法则,并且t n是任何monad的monad n.

我希望看到每个monad都有一个证明(理想情况下是建设性的证明),或者没有一个证明(带证明)的特定monad的例子.我对更多面向Haskell的答案以及(类别)理论答案感兴趣.

作为后续问题,是有一个单子m是有两个不同的变压器t1t2?也就是说,t1 Identity同构t2 Identitym,但有一个单子n这样t1 n是不是同构t2 n.

(IO并且ST有一个特殊的语义,所以我不在这里考虑它们,让我们完全忽略它们.让我们只关注可以使用数据类型构造的"纯"monad.)

monads haskell monad-transformers category-theory

65
推荐指数
2
解决办法
2112
查看次数

是否可以为Template Haskell中的函数生成注释?

在我们的项目中,我们有很多TH生成的函数.向它们添加通用注释是有意义的,以便它们在Haddock/Hoogle中可见.至少,像"这是由TH生成的".有可能吗?

haskell comments generated-code template-haskell

52
推荐指数
1
解决办法
392
查看次数

GHC的暴力有多原子?

GHC如何处理多个线程(显式线程或评估spark的内部线程)访问的thunk?是否会发生多个线程评估同一个thunk,重复工作?或者,如果thunks同步,如何,这样性能不会受到影响?

multithreading haskell lazy-evaluation ghc thunk

48
推荐指数
3
解决办法
2669
查看次数

标准(迈尔斯),最小,耐心和直方图差异算法产生的不同结果的例子

Git提供了这4种差异算法,但没有任何进一步的信息,它们的区别是什么.

每种算法有哪些优点?是否存在算法执行方式不同的各种情况的比较?

diff git-diff

44
推荐指数
2
解决办法
7812
查看次数

一个简单的例子表明IO不符合monad法则?

我已经看到提到IO不满足monad定律,但我没有找到一个简单的例子来证明这一点.有人知道一个例子吗?谢谢.

编辑:正如ertes和nm指出的那样,使用seq有点非法,因为它可以使任何monad失败的法律(结合undefined).由于undefined可以将其视为非终止计算,因此使用它完全没问题.

所以修改后的问题是:任何人都知道一个例子表明IO未能满足monad法则,而不使用seq(或者,IO如果seq不允许,可能会出现符合法律规定的证据?)

io monads haskell functional-programming

39
推荐指数
3
解决办法
4573
查看次数

调试堆分析中未显示的内存泄漏

我正在研究接收和处理JSON请求的Haskell守护程序.虽然守护进程的操作很复杂,但主要结构有意保持简单:它的内部状态只是IORef一个数据结构,所有线程都对此执行原子操作IORef.然后有几个线程在触发器上取值时用它做一些事情.

问题是守护进程泄漏了内存,我无法找到原因.它肯定与请求相关:当守护进程每秒收到多个请求时,它会泄漏大小为1MB/s(由Linux工具报告).内存消耗稳步增长.没有请求,内存消耗保持不变.

令我感到困惑的是,这些都没有在GHC分析中显示出来.要么我在配置文件参数中缺少某些内容,要么内存被其他内容消耗:

运行+RTS -hc -xt -p:

profiler输出的屏幕截图

运行+RTS -hr -xt -p:

profiler输出的屏幕截图

在此测试运行期间,守护程序随后消耗超过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)

profiling haskell memory-leaks ghc

37
推荐指数
1
解决办法
1223
查看次数

了解Either如何是Functor的一个实例

在我的空闲时间,我正在学习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)

现在:

  1. 我知道 fmap :: (c -> d) -> f c -> f d

  2. 如果我们替换f,Either a我们得到fmap :: (c -> d) -> Either …

haskell functor typeclass either

36
推荐指数
3
解决办法
7099
查看次数

可以将Go中的命令行标志设置为强制标志吗?

有没有办法设置某些标志是强制性的,还是我必须自己检查它们的存在?

command-line-interface go command-line-arguments

36
推荐指数
6
解决办法
2万
查看次数

什么是Alternative的"some"和"many"有用?

Alternative,的扩展Applicative,声明empty,<|>这两个功能:

一个或多个:

some :: f a -> f [a]
Run Code Online (Sandbox Code Playgroud)

零或更多:

many :: f a -> f [a]
Run Code Online (Sandbox Code Playgroud)

如果定义,some并且many应该是方程的最小解:

some v = (:) <$> v <*> many v

many v = some v <|> pure []
Run Code Online (Sandbox Code Playgroud)

我找不到一个实例somemany定义的实例.它们的含义和实际用途是什么?他们一直在使用吗?我只是从这个定义中无法理解他们的目的.

更新:我不是在问什么是什么Alternative,只是什么somemany

haskell applicative

35
推荐指数
4
解决办法
6988
查看次数