为什么NaN和数字的最大值是NaN,但是NaN的最小值和数字是多少?这似乎与我尝试的其他一些语言不一致:
在Haskell:
max (0/0) 1 -- NaN
min (0/0) 1 -- 1.0
Run Code Online (Sandbox Code Playgroud)
在Python中
>>> max(float("nan"),1) #nan
>>> min(float("nan"),1) #nan
Run Code Online (Sandbox Code Playgroud)
在JavaScript中
> Math.max(0/0,1) //NaN
> Math.min(0/0,1) //NaN
Run Code Online (Sandbox Code Playgroud) 在Haskell中使用FFI到C++时,我能够在运行函数时正确捕获异常cabal repl,但在运行时cabal run,不会捕获异常.
展示该问题的简单cabal项目如下:
exception.cabal:
name: exception
version: 0.1.0.0
build-type: Simple
cabal-version: >=1.10
executable exception
main-is: Main.hs
c-sources: main.cxx
build-depends: base >=4.7 && <4.8
default-language: Haskell2010
extra-libraries: stdc++
Run Code Online (Sandbox Code Playgroud)
main.cxx:
# include <exception>
# include <stdexcept>
extern "C" int hs_exception() try
{
throw std::logic_error("THIS FAILS!");
} catch(...) {
}
Run Code Online (Sandbox Code Playgroud)
和
Main.hs:
{-# LANGUAGE ForeignFunctionInterface #-}
module Main where
import Foreign.C.Types (CInt(..))
main = print c_hs_exception
foreign import ccall unsafe "hs_exception"
c_hs_exception :: CInt
Run Code Online (Sandbox Code Playgroud)
在REPL(即GHCI)工作 …
这部分是一个函数的Lift实例的后续操作?.但是,答案是全局定义函数或在引号内重写它.但是,我们将在fooa f的范围内使用很多具有不同功能的let.这使得我们几乎不可能定义f的多个全局版本.后者在引用中编写函数的解决方案似乎等同于在函数上编写一个提升.
那么,有没有办法解除在Haskell模板引用中使用的函数作为参数?
一个非常人为的例子:
foo.hs
{-# Language TemplateHaskell #-}
import Language.Haskell.TH
foo :: (Int->Int) -> Int -> ExpQ
foo f x = [|f x|]
g :: ExpQ
g =
let
f = (\x -> x+1)
f' = (\x' -> f(x') + 1)
in foo f' 0
Run Code Online (Sandbox Code Playgroud)
将失败:
foo.hs:5:11:
No instance for (Language.Haskell.TH.Syntax.Lift (Int -> Int))
arising from a use of ‘Language.Haskell.TH.Syntax.lift’
In the expression: Language.Haskell.TH.Syntax.lift f
In the expression: …Run Code Online (Sandbox Code Playgroud)