小编ale*_*tor的帖子

针对依赖性挑战的数据类型升级

通过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 types language-design dependent-type

36
推荐指数
2
解决办法
642
查看次数

在Haskell(GHC)中快速检查令人讨厌的外部函数

我想用Haskell的quickcheck库测试一些C代码.最简单的方法似乎是 foreign import在最终的haskell函数之上编写一个属性.这样做的问题是,如果C代码导致段错误或设法破坏内存,我的测试要么在没有输出的情况下崩溃,要么做一些完全不可预测的事情.

第二种方法是在C位上创建简单的可执行包装器,并在测试过程之外执行它们System.Process.不用说,这样做需要大量的脚手架和序列化值,但另一方面,它可以处理段错误.

有没有办法让foreign import战略像运行外部流程一样安全?

haskell ghc quickcheck memory-safety

24
推荐指数
1
解决办法
210
查看次数

将合同设计与类型系统进行比较

我最近阅读了一篇文章,将"按合同设计"与"测试驱动开发"进行了比较.似乎有很多重叠,一些冗余,以及DbC和TDD之间的一点协同作用.例如,有一些系统可以根据合同自动生成测试.

DbC以什么方式与现代类型系统重叠(例如在haskell中,或者是那些依赖类型的语言之一)并且有两点使用两者都比哪一方更好?

haskell types type-systems design-by-contract code-contracts

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

Control.Category有什么用?

如果我发现某些东西是Monoid或者Monad,我会全部使用各种有趣的功能,比如foldMap,sequence甚至mapM.他们让我开心.

如果我发现某些东西是什么,我会得到什么Category?难道我得到什么乐趣,除了超载id(.)

math haskell category-abstractions

14
推荐指数
2
解决办法
687
查看次数

从Haskell中的"强化静态检查工具"复制"污点模式"

我已经阅读了Fortify静态检查工具的一些文档.此工具使用的概念之一称为taints.某些来源(例如Web请求)提供以一种或多种方式受到污染的数据,而某些接收器(例如Web响应)要求数据不受污染.

Fortify的好处在于你可以拥有几种类型的污点.例如,您可以标记srand输出,NON_CRYPTO_RAND然后要求在使用变量进行加密时不存在此污点.其他示例包括非绑定的检查号码等.

是否有可能使用Haskell或其他编程语言中使用的更强大的静态类型系统来模拟污点,甚至更复杂的类型系统?

在Haskell中,我可以做类型,Tainted [BadRandom,Unbounded] Int但是使用它们进行计算似乎很困难,因为这种新类型限制了不限制污点的操作.

有没有更好的方法来实现这一目标?有关该主题的任何现有工作?

security haskell coq taint idris

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

monad变压器基准的奇怪结果.一个bug?

我做了一些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)

performance benchmarking haskell monad-transformers

13
推荐指数
2
解决办法
552
查看次数

git checkout - 通过单词补丁?

我们有一个项目,其中文件包含不幸的长行,不可能缩短它们.如果我们也可以使用git checkout --patch这些文件,我们可以显着简化我们的工作流程.这不起作用,因为如果整个巨行中有任何变化,该行将被标记为已更改.

通常,我们使用检查这些更改git diff --word-diff.是否有可能以checkout --patch类似的格式进行工作?还有其他方法可以解决我们的问题吗?

git vim patch

13
推荐指数
1
解决办法
1740
查看次数

适用于没有仿函数的人

我的类型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.

怎么能实现呢?

haskell ffi functor applicative

10
推荐指数
3
解决办法
713
查看次数

在haskell中依赖类型的队列

我尝试回答我自己关于在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)

haskell types dependent-type

9
推荐指数
1
解决办法
389
查看次数

Numeric.AD和打字问题

我正在尝试使用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 types automatic-differentiation

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