我有一个模块,它收集并导出一些小函数,例如:
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到处.
如何表达函数迭代是否有简洁,惯用的方式?也就是说,给定一个号码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解决方案甚至其他功能语言感兴趣.
从GHC的手册,安全语言部分:
模块边界控制 - 使用安全语言编译的Haskell代码保证只能访问通过其他模块导出列表公开可用的符号.其中一个重要的部分是安全编译的代码无法使用无法导入的数据构造函数来检查或创建数据值.如果模块M通过仔细使用其导出列表建立了一些不变量,则使用导入M的安全语言编译的代码保证遵守这些不变量.因此,模板Haskell
GeneralizedNewtypeDeriving以安全语言禁用,因为它们可用于违反此属性.
如何使用GeneralizedNewtypeDeriving?打破模块的不变量?
关于我的其他问题Haskell集合是否保证每个操作的最坏情况界限?,我很好奇:垃圾收集会导致多长时间停顿?
Haskell是否使用某种增量垃圾收集,以便程序一次只能停止一小段时间,或者在极端情况下可以停止几秒钟?
我找到了两篇SPJ的论文:https: //research.microsoft.com/en-us/um/people/simonpj/papers/non-stop/index.htm.但是如果这些想法实际上被GHC(或其他Haskell实现)采用,我没有找到参考.
我们习惯于为多态函数提供普遍量化的类型.存在量化类型的使用频率较低.我们如何使用通用型量词来表达存在量化类型?
haskell functional-programming existential-type higher-rank-types
在箭头:计算的通用接口我发现了关于超级功能的简短说明:
奇怪的数据类型
Run Code Online (Sandbox Code Playgroud)newtype Hyper b c = H (Hyper c b -> c)可以显示为箭头[KLP01].
但是这篇论文的链接被打破了.
还有超函数的Hackage包.
两者都没有提供任何解释,说明它们是什么以及它们的属性是什么.
那么什么是超功能,它们如何有用以及它们的属性是什么?
显然,在全纯函数的上下文中,相同的名称用于完全不同的东西
我几乎不知道这个概念,我只是猜测来自Haskell/FP的当前引用的标签,随时纠正它们.
这个答案是什么(斯卡拉的懒惰val)的(隐藏)成本?展示了它们是如何在Scala 2.7中实现的.但正如评论所说,从那以后这一定已经发生了变化,所以我很好奇,类lazy val变量的当前(2.10)实现是什么?
请考虑以下示例:
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中描述的:多态类型方案和递归定义 …
该免费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 []来代替,而结果将是守法的.
问题是什么,特别是哪些法律没有?
haskell ×9
ghc ×3
arrows ×2
scala ×2
delay ×1
free-monad ×1
functor ×1
inline ×1
iteration ×1
monads ×1
optimization ×1
profunctor ×1
recursion ×1
scala-2.10 ×1
variables ×1