相关疑难解决方法(0)

为什么GHC让修复如此混乱?

看一下GHC源代码,我可以看到修复的定义是:

fix :: (a -> a) -> a
fix f = let x = f x in x
Run Code Online (Sandbox Code Playgroud)

在一个示例中,修复程序使用如下:

fix (\f x -> let x' = x+1 in x:f x')
Run Code Online (Sandbox Code Playgroud)

这基本上产生了一个数字序列,它们增加1到无穷大.为了实现这一点,修复必须将它接收的函数作为它的第一个参数直接回到该函数.我不清楚上面列出的修复定义是如何做到的.

这个定义是我如何理解修复的工作原理:

fix :: (a -> a) -> a
fix f = f (fix f)
Run Code Online (Sandbox Code Playgroud)

所以现在我有两个问题:

  1. 如何X真的来临意味着修复X中的第一个定义?
  2. 在第二个定义中使用第一个定义是否有任何优势?

recursion haskell fixpoint-combinators

15
推荐指数
4
解决办法
767
查看次数

管道定义内部函数的原因

我正在查看管道库的源代码,例如在Core模块中,我不明白为什么作者到处都是使用定义函数的模式:

runEffect = go
  where
    go p = ...
Run Code Online (Sandbox Code Playgroud)

要么:

pull = go
  where
    go a' = ...
Run Code Online (Sandbox Code Playgroud)

要么:

reflect = go
  where
    go p = ...
Run Code Online (Sandbox Code Playgroud)

这是一些启用某些优化的技巧吗?我发现它很难看,如果它是一些优化技巧我真的希望编译器可以在没有这样的情况下做到这一点.但也许还有另一个原因?

haskell ghc haskell-pipes

5
推荐指数
1
解决办法
131
查看次数