Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设置Haskell';s GHCI以交互方式评估函数的签名(类型),而不是获取错误?_Haskell_Types_Ghc_Ghci - Fatal编程技术网

如何设置Haskell';s GHCI以交互方式评估函数的签名(类型),而不是获取错误?

如何设置Haskell';s GHCI以交互方式评估函数的签名(类型),而不是获取错误?,haskell,types,ghc,ghci,Haskell,Types,Ghc,Ghci,要在Haskell GHCI中查看函数的签名,我必须在它前面加上:t: Prelude> f = \x -> x+1 Prelude> :t f f :: Num a => a -> a 但每次输入前缀都会很快变老。如果我忽略它,我会得到错误: Prelude> f <interactive>:5:1: error: • No instance for (Show (a0 -> a0)) arising from a use of ‘pr

要在Haskell GHCI中查看函数的签名,我必须在它前面加上
:t

Prelude> f = \x -> x+1
Prelude> :t f
f :: Num a => a -> a
但每次输入前缀都会很快变老。如果我忽略它,我会得到错误:

Prelude> f

<interactive>:5:1: error:
• No instance for (Show (a0 -> a0)) arising from a use of ‘print’
    (maybe you haven't applied a function to enough arguments?)
• In the first argument of ‘print’, namely ‘it’
  In a stmt of an interactive GHCi command: print it
Prelude>f
:5:1:错误:
•没有因使用“打印”而产生的(显示(a0->a0))实例
(可能您没有对足够的参数应用函数?)
•在“print”的第一个参数中,即“it”
在交互式GHCi命令的stmt中:打印它
我不想得到这个错误消息,而是想看到一些关于我的函数
f
的有用信息,类似于我用
:tf
得到的信息(可能还有更多关于
f
的信息)


如何设置GHCI以实现此功能,即在没有
:t
的情况下输入函数信息?

您今天可能无法做到这一点。我已打开查看如何添加选项,以控制GHCi在提示时报告的类型错误。

GHCi将很高兴地使用选项
:set+t
向您显示您在提示中键入的任何内容的类型。唯一的问题是对该对象调用了
show
,并且没有适当的方式来显示函数-并且打印的类型仅适用于可以有效方式显示的表达式。但是,您可以很容易地解决此问题:

>newtype ShowType a = ShowType a
newtype ShowType a = ShowType a
>instance Show (ShowType a) where show _ = "The type is"
>:set +t
>ShowType const
The type is
it :: ShowType (a -> b -> a)
不幸的是,这造成了相当多的语法噪音。我的首选解决方案是将以下内容添加到
.ghci
文件中:

:set +t 
instance {-# OVERLAPS #-} Show a where show _ = "The type is"
将这样一个
Show
实例添加到任何真正的Haskell模块中都将是一个严重的错误,但是在
.ghci
模块中,它只适用于在提示符中键入的表达式,因此对我来说似乎没有问题。有了这个,您可以:

>const
The type is
it :: a -> b -> a
>show
The type is
it :: Show a => a -> String
方便的是,当您有一个类型为“技术上”有效但约束不可满足的函数时,仍然会出现类型错误:

>:t \x -> x `div` (x / x)
\x -> x `div` (x / x) :: (Integral a, Fractional a) => a -> a
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^

>\x -> x `div` (x / x)

<interactive>:12:1: error:
    * Ambiguous type variable `a0' arising from a use of `it'
      prevents the constraint `(Fractional a0)' from being solved.

不幸的是,如果左侧是通配符-
let=show
,则不会打印该类型。

非答案:
:i
命令显示有关超出其类型的值的一些额外信息;它也适用于类(但是,它是一个前缀命令,就像
:t
)。另外,
:set+t
将使GHCi打印在命令提示符下成功评估的任何内容的类型(然而,不幸的是,这对您所说的“无实例显示”情况并没有帮助)。我认为您应该以一种不影响GHCi的方式重新表述问题。你想要的似乎相当合理;如果你问得好,人们可能会对帮助更感兴趣。那么,错误消息应该会提示你repl是如何工作的。我认为你想要的是不可能的。不过这可能是个好主意。或者它可能是一个任意的特殊情况,会让人感到困惑。@jberryman,我认为它可能有一个变体,尽管我认为它应该由一个选项控制。OP的请求对我来说并不是一个很好的默认设置。也是一个没有答案的问题,但可能是一个有趣的问题:
instance(Typeable a,Typeable b)=>Show(a->b)where Show=Show。typeOf
。但是要注意多态函数。你的意思是我甚至不能重新配置在
f
上运行的函数(
Show
?),在这种情况下?@DmitriZaitsev,你可以配置用于在GHCi中打印值的函数,但这对你没有帮助,除非我对你想要的东西感到非常困惑。我在打印
:tf
(在错误消息之前)当键入
f
@DmitriZaitsev时,对,您在GHCi命令行中无法获得它。使用emacs或vim与GHCi进行交互时,您可能会得到很多。
>let _f = show
_f :: Show a => a -> String