【问题标题】:Is it possible to show a function's name in Haskell (ghci)?是否可以在 Haskell (ghci) 中显示函数名称?
【发布时间】:2019-12-18 17:32:51
【问题描述】:

我知道 show the function's body 是不可能的,因为 Haskell 进行了优化,但是否有可能以某种方式显示它的 名称

我想要类似的东西

Prelude> f
[Function f]

类似于其他 REPL 的功能(Python、javascript 等)

我用 Haskell 得到的是

Prelude> f
<interactive>:2:1: error:
    • No instance for (Show (Integer -> Integer)) arising from a use of ‘print’ (maybe you haven't applied a function to enough arguments?)
    • In a stmt of an interactive GHCi command: print it

这对演示没有帮助。

【问题讨论】:

  • 顺便说一句:如果您在前奏中输入 :i f:t f,您会得到名称以及有关该功能的更多信息,这可能有助于您的事业吗?
  • 这就是我想展示的内容,在 ˋ5ˋ 上执行 ˋconst fˋ 会得到 ˋfˋ
  • 它也会破坏引用透明度。因为在 Haskell 中,表达式与其计算结果之间应该没有功能上的差异。
  • @LukeCollins 出于演示目的,您可以使用具有?src 命令的lambdabot,请参阅this question
  • 函数没有名字。它们是。变量有名字。 5的名字是什么?没有。

标签: haskell functional-programming ghc


【解决方案1】:

出于演示目的,您可以尝试使用simple-reflect 包。它允许某些形式的符号计算:

> foldr f x [1,2,3]
f 1 (f 2 (f 3 x))
> foldl f x [1,2,3]
f (f (f x 1) 2) 3

请注意,它有其自身的局限性。例如 (f . g) x 除非使用合适的类型注释,否则将无法工作。 [1] ++ x 根本不起作用。

不过,如果您为演示准备示例,您可以提前检查它们并确保它们有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多