【问题标题】:Find inferred type for local function查找局部函数的推断类型
【发布时间】:2013-02-22 22:38:03
【问题描述】:

在 ghci(或 ghc)中有没有办法找到推断的局部函数类型是什么?

例如如果我有一个功能

f l = map f' l
   where f' = (+1)

ghci 中是否有类似:t 的方式来查看f' 的推断类型是什么?

【问题讨论】:

    标签: haskell type-inference ghci


    【解决方案1】:

    确实有,感谢 hammar 的出色回答 here。这是简短的版本:

    Prelude> :l /tmp/foo.hs
    [1 of 1] Compiling Main             ( /tmp/foo.hs, interpreted )
    Ok, modules loaded: Main.
    *Main> :break f
    Breakpoint 0 activated at /tmp/foo.hs:(1,1)-(2,18)
    *Main> f [1..10]
    Stopped at /tmp/foo.hs:(1,1)-(2,18)
    _result :: [b] = _
    [/tmp/foo.hs:(1,1)-(2,18)] *Main> :step
    Stopped at /tmp/foo.hs:1:7-14
    _result :: [b] = _
    f' :: b -> b = _
    l :: [b] = _
    [/tmp/foo.hs:1:7-14] *Main> :t f'
    f' :: b -> b
    

    【讨论】:

    • 这仅根据类型变量显示 f' 的类型,我认为这并不能完全回答 OP 的问题。您可以使用:print f' 更进一步,这将强制评估f'。然后:t f' 将显示具体类型。
    • 这很有趣,我无法获得完整的类型,即使有 @Code-Guru 的注释。例如。在这种情况下,它应该是f' :: (Num b) => b -> b
    • 是的,我有兴趣在这里解释带有和不带有显式多态类型签名以及存在诸如 NoMonomorphismRestriction 之类的扩展的行为的本质也许MonoLocalBinds。 @amindfv 你用的是什么版本的 GHC?
    • @jberryman - 我有一台运行 7.4.1 的机器,还有一台运行 7.0.4。
    • @amindfv 仔细查看后,我发现我原来的评论是不正确的。 :print f' 的行为不像我想的那样。我建议您查看haskell.org/ghc/docs/7.2.2/html/users_guide/ghci-debugger.html 可能有信息可以回答您的问题。
    【解决方案2】:

    我不知道 GHCi 有什么方法。

    但是,如果您使用的是 Emacs 或 Vim 等编辑器,您可以尝试 ghc-mod。这是一个插入编辑器的外部工具,它为 Haskell 程序提供了一些类似于 IDE 的功能,包括获取任意表达式类型的能力,包括本地定义。

    在 Emacs 中,您可以使用 C-c C-t 来查找表达式的类型。

    如果您不使用 Emacs 或 Vim,您可以将 ghc-mod 包装为 GHCi 扩展或其他东西,但我认为这会有些尴尬。如果没有类似编辑器的 UI,我无法想象一个好的方法。但是,ghc-mod 本身只是一个独立的命令行工具,因此很容易使用。如果您能想到一个独立于现有文本编辑器的良好用户界面,那就去吧!

    当然,如果您不使用 Emacs 或 Vim,您可能应该:P。

    【讨论】:

    • 我无法让它工作,但这看起来很棒!
    【解决方案3】:

    试试hdevtools,虽然只有 Vim 集成,但它非常快速且易于使用。

    【讨论】:

    • 你能描述一下如何用hdevtools获取表达式的类型吗?
    • hdevtools type file.hs 行列
    猜你喜欢
    • 1970-01-01
    • 2021-03-09
    • 2017-03-05
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    相关资源
    最近更新 更多