小编jek*_*jek的帖子

在Haskell中使用NaN的最大值和最小值

为什么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

18
推荐指数
3
解决办法
1059
查看次数

在Haskell中捕获C++ FFI异常失败

在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)工作 …

c++ haskell cabal

7
推荐指数
1
解决办法
395
查看次数

函数作为模板haskell引用中使用的参数

这部分是一个函数的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)

haskell template-haskell

5
推荐指数
1
解决办法
538
查看次数

标签 统计

haskell ×3

c++ ×1

cabal ×1

template-haskell ×1