如何使用 GHCI 查找子函数的类型
How to find the type of subfunctions with GHCI
是否可以使用 GHCI 找到 where
语句中定义的函数类型?
例如,考虑这个函数:
myFunction a b c = case result of
2 -> ...
where
subFunctA = ...
_ -> ...
where
subFunctB = ...
subFunctC = ...
myFunction
的类型可以用:t myFunction
查找。
是否可以使用 GHCI 找到 subFunctA
、subFuncB
和 subFunctC
的类型?
没有。 GHCi 无法访问其函数的源代码。即使您在 GHCi 或源文件中自己定义函数也是如此。
作为替代方案:由于您可以访问您想知道的函数的源代码,您可以将这些函数复制到源文件的全局范围内,编译它们,然后查看 GHC 分配给它们的类型。我经常这样做。 (另外,您可以直接将它们粘贴到 GHCi 中。)完成此操作后,您可以随心所欲地对它们调用 :t。这确实 运行 产生比实际子函数更通用的类型的风险,但它仍然可以帮助你。
如果您有足够新的 GHCi 版本,您可以尝试使用 typed holes。
基本上,如果您在代码中写下划线,编译器会吐出一条错误消息,告诉您子表达式 应该 的类型。在您的示例中,只需将“...
”替换为“_
”。
是否可以使用 GHCI 找到 where
语句中定义的函数类型?
例如,考虑这个函数:
myFunction a b c = case result of
2 -> ...
where
subFunctA = ...
_ -> ...
where
subFunctB = ...
subFunctC = ...
myFunction
的类型可以用:t myFunction
查找。
是否可以使用 GHCI 找到 subFunctA
、subFuncB
和 subFunctC
的类型?
没有。 GHCi 无法访问其函数的源代码。即使您在 GHCi 或源文件中自己定义函数也是如此。
作为替代方案:由于您可以访问您想知道的函数的源代码,您可以将这些函数复制到源文件的全局范围内,编译它们,然后查看 GHC 分配给它们的类型。我经常这样做。 (另外,您可以直接将它们粘贴到 GHCi 中。)完成此操作后,您可以随心所欲地对它们调用 :t。这确实 运行 产生比实际子函数更通用的类型的风险,但它仍然可以帮助你。
如果您有足够新的 GHCi 版本,您可以尝试使用 typed holes。
基本上,如果您在代码中写下划线,编译器会吐出一条错误消息,告诉您子表达式 应该 的类型。在您的示例中,只需将“...
”替换为“_
”。