为什么我的Haskell断言只发生在IHaskell中?

为什么我的Haskell断言只发生在IHaskell中?,haskell,assert,assertions,Haskell,Assert,Assertions,如果我定义 import Control.Exception (assert) import Data.Char (ord) f :: String -> String f s = assert (all (`elem` letters) s) $ (letters!!) <$> (ix <$> s) where ix ch = (ord ch - ord 'A') letters = ['A'..'Z'] 在伊哈斯克尔,

如果我定义

import Control.Exception (assert)
import Data.Char (ord)

f :: String -> String
f s = assert (all (`elem` letters) s) $ (letters!!) <$> (ix <$> s)
    where
        ix ch = (ord ch - ord 'A')
        letters = ['A'..'Z']
在伊哈斯克尔,我得到了

:10:7-12: Assertion failed
正如我所料。但在所有其他设置中,断言似乎被忽略。例如,在GHCi(7.10.2)中,我得到

如果我把这个表达式放到程序中

main :: IO ()
main = do
    print $ f "AB.CD"
我明白了

为什么除了在伊哈斯克尔,我的主张到处都被忽视了


在GHCi中,
:set
给出:

options currently set: none.
base language is: Haskell2010
with the following modifiers:
  -XNoDatatypeContexts
  -XNondecreasingIndentation
GHCi-specific dynamic flag settings:
other dynamic, non-language, flag settings:
  -fimplicit-import-qualified
warning settings:

在GHCi 7.10(我假设您正在使用)和7.6中,这个断言对我来说效果很好,您确定这种情况吗?在编译的示例中,您是否使用优化进行编译?在这种情况下,断言就变成了否定-ops@jberryman:7.10.2(已添加)。是的,当然。我可以在GHCi中设置一些优化功能吗?我在编译时没有设置任何标志(我知道)。GHCi中的
:set
命令的输出是否包含
-fignore断言
?这将解释GHCi,尽管不是独立的GHC。。。或者,GHCi字节码从不优化,它是否包含
-fobject code
?@rjanJohansen:question.Hm中添加了
:set
的输出。另一种预感是,如果您有模块/程序的
*.o
文件,请在再次尝试GHCi之前尝试删除它。它可能是通过优化编译的,然后所有其他路径都会选择它。。。
main :: IO ()
main = do
    print $ f "AB.CD"
prgm: Prelude.!!: negative index
"AB
options currently set: none.
base language is: Haskell2010
with the following modifiers:
  -XNoDatatypeContexts
  -XNondecreasingIndentation
GHCi-specific dynamic flag settings:
other dynamic, non-language, flag settings:
  -fimplicit-import-qualified
warning settings: