这是一些需要-XRebindableSyntax
的简单代码。
{-# LANGUAGE RebindableSyntax, NoImplicitPrelude #-}
import NumericPrelude
import qualified Algebra.Additive (C)
import qualified Algebra.Ring (C)
newtype Foo = Foo Int deriving (Show)
instance Algebra.Additive.C Foo where
(Foo x) + (Foo y) = Foo (x+y)
instance Algebra.Ring.C Foo where
fromInteger = Foo . fromInteger
f :: Foo -> Foo -> Foo
f x y = x + y
g = f 3 5
这是我的GHCi成绩单:
> ghci Foo.hs
GHCi, version 7.8.2
...
*Main> g
Foo 8
*Main> f 3 5
<interactive>:3:3:
No instance for (GHC.Num.Num Foo) arising from the literal ‘3’
In the first argument of ‘f’, namely ‘3’
In the expression: f 3 5
In an equation for ‘it’: it = f 3 5
*Main> :set -XRebindableSyntax
*Main> f 3 5
Foo 8
我95%确定当我在GHCi 7.8之前加载扩展名的文件时,我不必在GHCi中重置该扩展名。这是在某处记录的,还是一个bug?有一个简单的解决方法(例如,告诉GHCi总是使用-XRebindableSyntax
,我通常需要它吗?)
答案 0 :(得分:3)
是否有简单的解决方法(例如,告诉GHCi始终使用-XRebindableSyntax,我通常需要它?)
您可以将.ghci
文件放在与源文件相同的目录中。现在,如果从该目录启动ghci,将加载.ghci
文件并执行其内容,就像您在ghci提示符下键入的命令一样。在这种情况下,您可以将:set -XRebindableSyntax
放在那里。
我认为这比将:set -XRebindableSyntax
放入主目录中的.ghci
更好,因为您可能在其他需要不同扩展名的目录中有其他Haskell项目。
有关项目特定ghci文件的更多建议,请参阅Neil Mitchell's blog post。