小编ham*_*mar的帖子

如何在Haskell中抛出异常并退出程序?

我有一个问题:如何抛出异常并退出程序?我写了一个简单的例子:

-- main.hs
import Test

main = do
    Test.foo ""
    putStrLn "make some other things"
Run Code Online (Sandbox Code Playgroud)

这是模块:

moldule Test where

foo :: String -> IO ()
foo x = do
    if null x
    then THROW EXCEPTION AND EXIT MAIN else putStrLn "okay"
Run Code Online (Sandbox Code Playgroud)

我想启动它并抛出异常并退出程序,但是如何?

haskell exception throw

17
推荐指数
1
解决办法
7475
查看次数

为什么Safe Haskell不支持Template Haskell?

Safe Haskell的文档说明:

[...]不幸的是,模板Haskell可用于破坏模块边界,因此可用于获取对此构造函数的访问权限.[...]使用-XSafe标志编译Danger模块会限制可用于安全子集的Haskell功能.这包括禁止不安全的PerfromIO,模板Haskell,[...]

用作将AST转换为另一个AST的宏系统,是否不能简单地将TH限制为Haskell的安全子集,并将结果AST限制为该子集?

haskell template-haskell

17
推荐指数
1
解决办法
827
查看次数

为什么Haskell中没有内置的Set数据类型?

是否有人可以向我解释为什么SetHaskell中没有定义数据类型?

旁注:我只是学习Haskell作为逻辑课程的一部分,其中集合论非常重要,因此在Haskell中使用集合的概念会非常方便.有一个列表并删除重复项(并可能排序)也会产生一个集合,但我很好奇是否有一个特殊的原因,它不是内置的?

haskell types set

17
推荐指数
3
解决办法
8772
查看次数

如何用惯用的monadic动作组织我的纯函数

我决定今天是我修复一些不必要地在monadic动作中运行的纯函数的那一天.这就是我所拥有的.

flagWorkDays :: [C.Day] -> Handler [WorkDay] 
flagWorkDays dayList =
   flagWeekEnds dayList >>=
   flagHolidays >>=
   flagScheduled >>=
   flagASAP >>=
   toWorkDays
Run Code Online (Sandbox Code Playgroud)

这是flagWeekEnds,截至目前.

flagWeekEnds :: [C.Day] -> Handler [(C.Day,Availability)]
flagWeekEnds dayList = do
   let yepNope = Prelude.map isWorkDay dayList
       availability = Prelude.map flagAvailability yepNope
   return $ Prelude.zip dayList availability
Run Code Online (Sandbox Code Playgroud)

flagHolidays遵循类似的模式.toWorkDays只是将一种类型更改为另一种类型,并且是纯函数.

flagScheduled,flagASAP是monadic行动.我不确定如何将monadic动作与惯用语中的纯函数结合起来flagWorkDays.有人可以帮我解决flagWorkDays,假设flagWeekEnds并且flagHolidays已经变得纯净了吗?

monads haskell function-composition

17
推荐指数
3
解决办法
556
查看次数

Haskell中的Lambda演算:有没有办法让教堂数字类型检查?

我正在玩Haskell中的一些lambda演算,特别是教堂数字.我有以下定义:

let zero = (\f z -> z)
let one = (\f z -> f z)
let two = (\f z -> f (f z))
let iszero = (\n -> n (\x -> (\x y -> y)) (\x y -> x))
let mult = (\m n -> (\s z -> m (\x -> n s x) z))
Run Code Online (Sandbox Code Playgroud)

这有效:

:t (\n -> (iszero n) one (mult one one))
Run Code Online (Sandbox Code Playgroud)

发生检查时失败:

:t (\n -> (iszero n) one (mult n one))
Run Code Online (Sandbox Code Playgroud)

iszero和 …

haskell lambda-calculus church-encoding

17
推荐指数
2
解决办法
1811
查看次数

如何告诉QuickCheck只为参数生成有效的列表索引?

假设我想为(!!)函数编写一些单元测试.

my_prop xs n = ...
Run Code Online (Sandbox Code Playgroud)

我想将n限制为仅有效的索引,我知道我可以做类似的事情

my_prop xs n = (not.null) (drop n xs) ==> ...
Run Code Online (Sandbox Code Playgroud)

但这使得绝大多数生成的案例都无效并被抛弃.有没有办法我可以设置,以便QuickCheck xs首先生成列表并使用其值只生成有效的情况n

haskell quickcheck

16
推荐指数
3
解决办法
1132
查看次数

Python - 仅在变量存在时传递参数

我有以下变量,用户可以选择通过表单提交(它们不是必需的,但可以这样做以过滤搜索).

color = request.GET.get ('color')
size = request.GET.get ('size')
Run Code Online (Sandbox Code Playgroud)

现在我想将这些变量传递给一个函数,但前提是它们存在.如果它们不存在,我想只运行没有参数的函数.

没有参数的函数是:

apicall = search ()
Run Code Online (Sandbox Code Playgroud)

只有它的颜色

apicall = search (color)
Run Code Online (Sandbox Code Playgroud)

它的颜色和大小

apicall = search (color, size)
Run Code Online (Sandbox Code Playgroud)

如果定义了参数,我想将它传递给函数,但如果不是,我不想传递它.

最有效的方法是什么?python有内置的方法吗?

python

16
推荐指数
2
解决办法
2万
查看次数

如何使用Criterion来衡量Haskell程序的性能?

我正在尝试使用Criterion框架来衡量一个简单的Haar DWT程序的性能.(这是错误的慢,但我会留下另一个问题).遗憾的是,我无法在网上找到任何好的文档.我的两个主要问题是

  • 如何将数据从一个基准传递到另一个?我想计划该计划的每个阶段.
  • 采样如何工作,并避免延迟评估重用其先前的计算?

这个来源相对减少了; 第一个函数getRandList生成一个随机数列表; haarStep将输入信号转换为差值和求和,并haarDWT调用前者并对求和进行递归.我试图传递getRandListhaarDWT通过懒惰的评价,但也许我的使用是不正确/不支持.时间似乎没有意义.

{-# LANGUAGE ViewPatterns #-}

import Control.Arrow
import qualified Data.Vector.Unboxed as V
import System.Random
import Criterion.Main

invSqrt2 = 0.70710678118654752440

getRandList :: RandomGen g => g -> Int -> [Float]
getRandList gen 0 = []
getRandList gen n = v:rest where
    (v, gen') = random gen
    rest = getRandList gen' (n - 1)

haarStep :: V.Vector Float -> (V.Vector Float, V.Vector Float)
haarStep = (alternatingOp (-) …
Run Code Online (Sandbox Code Playgroud)

performance haskell haskell-criterion

15
推荐指数
1
解决办法
2353
查看次数

继续传递类​​型的样式表示

假设我们有一个单子,通过定义return,(>>=)以及一套法律.有一种数据类型

newtype C m a = C { unC ? forall r. (a ? m r) ? m r }
Run Code Online (Sandbox Code Playgroud)

也称为密度.C m a ? m a鉴于这m是一个Monad,即我们可以编写两个函数to ? Monad m ? m a ? C m afrom ? Monad m ? C m a ? m a

to ? Monad m ? m a ? C m a
to t = C $ \f ? t …
Run Code Online (Sandbox Code Playgroud)

continuations haskell continuation-passing

15
推荐指数
1
解决办法
922
查看次数

按等价关系列出的组列表

我在集合上有等价关系 .如何构建等价类?它就是这样,但在所有元素之间,不仅仅是邻居.RAAgroupBy

例如,equal是等价关系(它是自反,对称和传递二元关系):

type Sometuple = (Int, Int, Int)

equal :: Sometuple -> Sometuple -> Bool
equal (_, x, _) (_, y, _) = x == y
Run Code Online (Sandbox Code Playgroud)

它实际上是连接2个Sometuple元素的谓词.

?> equal (1,2,3) (1,2,2)
True
Run Code Online (Sandbox Code Playgroud)

那么,我如何[Sometuple]基于equal谓词构建所有等价类?像这样的东西:

equivalenceClasses :: (Sometuple -> Sometuple -> Bool) -> [Sometuple] -> [[Sometuple]]
?> equivalenceClasses equal [(1,2,3), (2,1,4), (0,3,2), (9,2,1), (5,3,1), (1,3,1)]
[[(1,2,3),(9,2,1)],[(2,1,4)],[(0,3,2),(5,3,1),(1,3,2)]]
Run Code Online (Sandbox Code Playgroud)

haskell list

14
推荐指数
1
解决办法
1840
查看次数