通过ghc 7.4阅读.预发行说明和给予Haskell一份推广文章,我仍然对你实际使用推广类型做了什么感到困惑.例如,GHC手册提供了有关提升数据类型的以下示例:
data Nat = Ze | Su Nat
data List a = Nil | Cons a (List a)
data Pair a b = Pair a b
data Sum a b = L a | R b
Run Code Online (Sandbox Code Playgroud)
这些有什么用途?你能给(代码)例子吗?
我想用Haskell的quickcheck库测试一些C代码.最简单的方法似乎是 foreign import在最终的haskell函数之上编写一个属性.这样做的问题是,如果C代码导致段错误或设法破坏内存,我的测试要么在没有输出的情况下崩溃,要么做一些完全不可预测的事情.
第二种方法是在C位上创建简单的可执行包装器,并在测试过程之外执行它们System.Process.不用说,这样做需要大量的脚手架和序列化值,但另一方面,它可以处理段错误.
有没有办法让foreign import战略像运行外部流程一样安全?
我最近阅读了一篇文章,将"按合同设计"与"测试驱动开发"进行了比较.似乎有很多重叠,一些冗余,以及DbC和TDD之间的一点协同作用.例如,有一些系统可以根据合同自动生成测试.
DbC以什么方式与现代类型系统重叠(例如在haskell中,或者是那些依赖类型的语言之一)并且有两点使用两者都比哪一方更好?
haskell types type-systems design-by-contract code-contracts
如果我发现某些东西是Monoid或者Monad,我会全部使用各种有趣的功能,比如foldMap,sequence甚至mapM.他们让我开心.
如果我发现某些东西是什么,我会得到什么Category?难道我得到什么乐趣,除了超载id和(.)?
我已经阅读了Fortify静态检查工具的一些文档.此工具使用的概念之一称为taints.某些来源(例如Web请求)提供以一种或多种方式受到污染的数据,而某些接收器(例如Web响应)要求数据不受污染.
Fortify的好处在于你可以拥有几种类型的污点.例如,您可以标记srand输出,NON_CRYPTO_RAND然后要求在使用变量进行加密时不存在此污点.其他示例包括非绑定的检查号码等.
是否有可能使用Haskell或其他编程语言中使用的更强大的静态类型系统来模拟污点,甚至更复杂的类型系统?
在Haskell中,我可以做类型,Tainted [BadRandom,Unbounded] Int但是使用它们进行计算似乎很困难,因为这种新类型限制了不限制污点的操作.
有没有更好的方法来实现这一目标?有关该主题的任何现有工作?
我做了一些Criterion基准测试,通过在monad堆栈上运行我的代码来估计我失去了多少性能.结果很奇怪,我可能在我的基准测试中偶然发现了一些懒惰的陷阱.
基准测试告诉我,即使不使用,WriterT String IO运行速度也比运行简单快20倍(!).古怪的,如果我栈与和它仅仅是5倍速度较慢.这可能是我的基准测试中的一个错误.我在这做错了什么?IOtellWriterTReaderTContT
{-#LANGUAGE BangPatterns#-}
module Main where
import Criterion.Main
import Control.Monad
import Control.Monad.Writer
import Control.Monad.Reader
import Control.Monad.Cont
process :: Monad m => Int -> m Int
process = foldl (>=>) return (replicate 100000 (\(!x) -> return (x+1)))
test n = process n >> return ()
main = defaultMain [
bench "Plain" t0
,bench "Writer" t1
,bench "Reader" t2
,bench "Cont" t3
,bench "RWC" t4
]
t0 = test 1 :: …Run Code Online (Sandbox Code Playgroud) 我们有一个项目,其中文件包含不幸的长行,不可能缩短它们.如果我们也可以使用git checkout --patch这些文件,我们可以显着简化我们的工作流程.这不起作用,因为如果整个巨行中有任何变化,该行将被标记为已更改.
通常,我们使用检查这些更改git diff --word-diff.是否有可能以checkout --patch类似的格式进行工作?还有其他方法可以解决我们的问题吗?
我的类型Image基本上是一个浮点数的c数组.可以轻松创建诸如map :: (Float -> Float) -> Image -> Image或之类的功能zipWith :: (Float -> Float -> Float) -> Image -> Image -> Image.
但是,我有一种感觉,也可以在这些函数之上提供看起来像应用实例的东西,允许更灵活的像素级操作,如((+) <$> image1 <*> image2)或((\x y z -> (x+y)/z) <$> i1 <*> i2 <*> i3).然而,天真的方法失败了,因为Image类型不能包含浮点数以外的东西,因此无法实现fmap.
怎么能实现呢?
我尝试回答我自己关于在GHC中使用PolyKinds扩展的示例的问题,并提出了一个更具体的问题.我正在尝试建模一个由两个列表构建的队列,dequeue从中获取元素的头列表,以及enqueue放置它们的尾部列表.为了使这个有趣,我决定添加一个约束,尾部列表不能长于头部列表.
enqueue如果队列应该平衡,似乎必须返回不同的类型.是否可以enqueue使用此约束为函数提供正确的类型?
我目前拥有的代码在这里:
{-#LANGUAGE MultiParamTypeClasses, FlexibleInstances,
UndecidableInstances, TypeFamilies, PolyKinds, GADTs,
RankNTypes#-}
-- Queue consist of a head and tail lists with the invariant that the
-- tail list should never grow longer than the head list.
-- Type for representing the invariant of the queue
data MyConstraint = Constraint Nat Nat
type family Valid c :: Bool
type instance Valid (Constraint a b) = GE a b
-- The queue type. …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Numeric.AD和自定义Expr类型.我希望计算用户输入表达式的符号梯度.使用常量表达式的第一个试验非常有效:
calcGrad0 :: [Expr Double]
calcGrad0 = grad df vars
where
df [x,y] = eval (env [x,y]) (EVar "x"*EVar "y")
env vs = zip varNames vs
varNames = ["x","y"]
vars = map EVar varNames
Run Code Online (Sandbox Code Playgroud)
这有效:
>calcGrad0
[Const 0.0 :+ (Const 0.0 :+ (EVar "y" :* Const 1.0)),Const 0.0 :+ (Const 0.0 :+ (EVar "x" :* Const 1.0))]
Run Code Online (Sandbox Code Playgroud)
但是,如果我将表达式作为参数拉出:
calcGrad1 :: [Expr Double]
calcGrad1 = calcGrad1' (EVar "x"*EVar "y")
calcGrad1' e = grad df vars
where
df [x,y] = eval (env …Run Code Online (Sandbox Code Playgroud) haskell ×9
types ×4
applicative ×1
benchmarking ×1
coq ×1
ffi ×1
functor ×1
ghc ×1
git ×1
idris ×1
math ×1
patch ×1
performance ×1
quickcheck ×1
security ×1
taint ×1
type-systems ×1
vim ×1