我有一个问题:如何抛出异常并退出程序?我写了一个简单的例子:
-- 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)
我想启动它并抛出异常并退出程序,但是如何?
Safe Haskell的文档说明:
[...]不幸的是,模板Haskell可用于破坏模块边界,因此可用于获取对此构造函数的访问权限.[...]使用-XSafe标志编译Danger模块会限制可用于安全子集的Haskell功能.这包括禁止不安全的PerfromIO,模板Haskell,[...]
用作将AST转换为另一个AST的宏系统,是否不能简单地将TH限制为Haskell的安全子集,并将结果AST限制为该子集?
是否有人可以向我解释为什么SetHaskell中没有定义数据类型?
旁注:我只是学习Haskell作为逻辑课程的一部分,其中集合论非常重要,因此在Haskell中使用集合的概念会非常方便.有一个列表并删除重复项(并可能排序)也会产生一个集合,但我很好奇是否有一个特殊的原因,它不是内置的?
我决定今天是我修复一些不必要地在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已经变得纯净了吗?
我正在玩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和 …
假设我想为(!!)函数编写一些单元测试.
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?
我有以下变量,用户可以选择通过表单提交(它们不是必需的,但可以这样做以过滤搜索).
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有内置的方法吗?
我正在尝试使用Criterion框架来衡量一个简单的Haar DWT程序的性能.(这是错误的慢,但我会留下另一个问题).遗憾的是,我无法在网上找到任何好的文档.我的两个主要问题是
这个来源相对减少了; 第一个函数getRandList生成一个随机数列表; haarStep将输入信号转换为差值和求和,并haarDWT调用前者并对求和进行递归.我试图传递getRandList给haarDWT通过懒惰的评价,但也许我的使用是不正确/不支持.时间似乎没有意义.
{-# 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) 假设我们有一个单子,通过定义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 a和from ? 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) 我在集合上有等价关系 .如何构建等价类?它就是这样,但在所有元素之间,不仅仅是邻居.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 ×9
exception ×1
list ×1
monads ×1
performance ×1
python ×1
quickcheck ×1
set ×1
throw ×1
types ×1