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

对于小型,导出的函数,我是否需要打扰INLINE/INLINABLE编译指示,或者GHC会为我做这些吗?

我有一个模块,它收集并导出一些小函数,例如:

fromEither :: (MonadError e m) => Either e a -> m a
fromEither = either throwError return
Run Code Online (Sandbox Code Playgroud)

要么

withError :: MonadError e m => (e -> e) -> m a -> m a
withError = flip catchError (throwError . f)
Run Code Online (Sandbox Code Playgroud)

让它们内联是个好主意,因为在专门研究MonadError它的特定实例之后,可能会有很多代码被优化掉.

GHC的文件说:

GHC(与-O往常一样)尝试内联(或"展开")"足够小"的函数/值,从而避免调用开销并可能暴露其他更精彩的优化.通常情况下,如果GHC决定函数"太昂贵"而无法内联,它将不会这样做,也不会导出其他模块使用的展开.

这是否意味着这些函数最有可能被视为具有INLINE编译指示(即它们在接口文件中记录的非优化RHS)?或者我必须添加INLINE自己?添加它会改变什么(假设GHC决定它们"足够小")?

我不介意GHC决定不介绍我的一些功能,如果它觉得它们太贵了,但总的来说我想让它们内联而不会污染我的源代码并添加INLINE到处.

optimization haskell inline ghc

23
推荐指数
2
解决办法
892
查看次数

如何简洁地表达函数迭代?

如何表达函数迭代是否有简洁,惯用的方式?也就是说,给定一个号码n和一个功能f :: a -> a,我想表达\x -> f(...(f(x))...),其中f应用n-times.

当然,我可以为此创建自己的递归函数,但是如果有一种方法可以使用现有工具或库快速表达它,我会感兴趣.

到目前为止,我有这些想法:

  • \n f x -> foldr (const f) x [1..n]
  • \n -> appEndo . mconcat . replicate n . Endo

但他们都使用中间名单,并不是很简洁.

到目前为止我找到的最短的一个使用半群:

  • \n f -> appEndo . times1p (n - 1) . Endo,

但它只适用于正数(不适用于0).

主要是我专注于Haskell中的解决方案,但我也对Scala解决方案甚至其他功能语言感兴趣.

iteration haskell functional-programming scala

22
推荐指数
3
解决办法
1038
查看次数

亵渎者和箭头之间的关系是什么?

显然,每个人Arrow都是一个Strong教练.确实^>>>>^对应lmaprmap.而first'second'只是同firstsecond.同样,每个人ArrowChoice也都是Choice.

与箭相比,影响者缺乏的是构成它们的能力.如果我们添加构图,我们会得到一个箭头吗?换句话说,如果(强)profunctor也是一个类别,它是否已经是一个箭头?如果没有,有什么遗漏?

haskell arrows functor category-theory profunctor

22
推荐指数
2
解决办法
2446
查看次数

为什么不是GeneralizedNewtypeDeriving一个安全的Haskell?

从GHC的手册,安全语言部分:

模块边界控制 - 使用安全语言编译的Haskell代码保证只能访问通过其他模块导出列表公开可用的符号.其中一个重要的部分是安全编译的代码无法使用无法导入的数据构造函数来检查或创建数据值.如果模块M通过仔细使用其导出列表建立了一些不变量,则使用导入M的安全语言编译的代码保证遵守这些不变量.因此,模板Haskell GeneralizedNewtypeDeriving以安全语言禁用,因为它们可用于违反此属性.

如何使用GeneralizedNewtypeDeriving?打破模块的不变量?

haskell ghc language-extension

20
推荐指数
1
解决办法
3530
查看次数

由于垃圾回收,Haskell程序可能会发生多长时间的暂停?

关于我的其他问题Haskell集合是否保证每个操作的最坏情况界限?,我很好奇:垃圾收集会导致多长时间停顿?

Haskell是否使用某种增量垃圾收集,以便程序一次只能停止一小段时间,或者在极端情况下可以停止几秒钟?

我找到了两篇SPJ的论文:https: //research.microsoft.com/en-us/um/people/simonpj/papers/non-stop/index.htm.但是如果这些想法实际上被GHC(或其他Haskell实现)采用,我没有找到参考.

garbage-collection haskell delay

19
推荐指数
1
解决办法
1319
查看次数

如何使用更高级别(rank-N)类型的多态性来表达存在类型?

我们习惯于为多态函数提供普遍量化的类型.存在量化类型的使用频率较低.我们如何使用通用型量词来表达存在量化类型?

haskell functional-programming existential-type higher-rank-types

19
推荐指数
2
解决办法
1451
查看次数

什么是计算机科学背景下的超功能?

箭头:计算的通用接口我发现了关于超级功能的简短说明:

奇怪的数据类型

newtype Hyper b c = H (Hyper c b -> c)
Run Code Online (Sandbox Code Playgroud)

可以显示为箭头[KLP01].

但是这篇论文的链接被打破了.

还有超函数的Hackage包.

两者都没有提供任何解释,说明它们是什么以及它们的属性是什么.

那么什么是超功能,它们如何有用以及它们的属性是什么?


显然,在全纯函数的上下文中,相同的名称用于完全不同的东西

我几乎不知道这个概念,我只是猜测来自Haskell/FP的当前引用的标签,随时纠正它们.

haskell functional-programming arrows

19
推荐指数
1
解决办法
333
查看次数

如何在Scala 2.10中实现惰性val类变量?

这个答案什么(斯卡拉的懒惰val)的(隐藏)成本?展示了它们是如何在Scala 2.7中实现的.但正如评论所说,从那以后这一定已经发生了变化,所以我很好奇,类lazy val变量的当前(2.10)实现是什么?

variables scala lazy-evaluation scala-2.10

17
推荐指数
1
解决办法
1984
查看次数

在Haskell(GHC)中使用什么算法来导出递归表达式的类型?

请考虑以下示例:

非递归函数

 f x = x
 g y = f 'A'
Run Code Online (Sandbox Code Playgroud)

GHC推断 f :: a -> a

相互递归函数

 f x = const x g
 g y = f 'A'
Run Code Online (Sandbox Code Playgroud)

现在GHC推断f :: Char -> Char,即使类型可能a -> a只是在前一种情况下.

多态递归

 data FullTree a = Leaf | Bin a (FullTree (a, a))

 size :: FullTree a -> Int
 size Leaf = 0
 size (Bin _ t) = 1 + 2 * size t
Run Code Online (Sandbox Code Playgroud)

size除非给出明确的类型,否则GHC无法推断出类型.


因此,看起来Haskell(GHC)不使用多态递归(如Alan Mycroft中描述的:多态类型方案和递归定义 …

recursion haskell type-inference ghc hindley-milner

17
推荐指数
1
解决办法
617
查看次数

Control.MonadPlus.Free出了什么问题?

免费MonadPlus定义为

data Free f a = Pure a | Free (f (Free f a)) | Plus [Free f a]
Run Code Online (Sandbox Code Playgroud)

已使用以下注释(changelog)在free 4.6 中删除:

删除了Control.MonadPlus.Free.使用FreeT f []来代替,而结果将是守法的.

问题是什么,特别是哪些法律没有?

monads haskell free-monad

17
推荐指数
1
解决办法
266
查看次数