小编She*_*rsh的帖子

如何用“反射”包替换 ImplicitParams?

我有一个枚举类型,例如

data MyType = A | B
Run Code Online (Sandbox Code Playgroud)

我希望能够将这种类型的值隐式传递给我的函数。我可以使用ImplicitParamsGHC 扩展来做到这一点:

type HasMyType = (?myType :: MyType)

myFun :: HasMyType => String
myFun = case ?myType of
    A -> "Foo"
    B -> "Bar"
Run Code Online (Sandbox Code Playgroud)

但是我多次听说,最好使用 Haskell 包反射来完成这项任务。不幸的是,reflection文档没有解释如何使用库编写类似的代码。弄清楚它并不是那么简单。

所以,我的问题是,是否可以使用该reflection库来实现类似的代码并满足以下要求?

  1. 的值MyType应该隐式传递。
  2. 如果HasMyType未指定约束,MyType则应采用默认值。
  3. 应该可以HasMyType在一个地方覆盖通过约束传递的值,例如在应用程序的开头。

这样的事情可能吗?或者使用reflection库最接近的近似值是什么?

reflection haskell typeclass implicit-parameters

8
推荐指数
1
解决办法
137
查看次数

如何在应用了类型默认规则的ghci中打印多态函数(或值)的类型?

当我:t在GHCi中输入命令时,我看到多态类型:

ghci> :t 42
42 :: Num t => t
ghci> :t div
div :: Integral a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

但在我实际评估这些函数后,我看到了类型默认规则的结果.是否有一些命令或能力在ghci中观察在根据Haskell报告和/或ghc实现应用类型默认规则后将如何更改类型?

polymorphism haskell types ghci monomorphism-restriction

7
推荐指数
2
解决办法
165
查看次数

使用Hedgehog(或任何其他基于属性的测试框架)生成随机GADT的最安全方法

我有像这样的GADT:

data TType a where
    TInt  :: TType Int
    TBool :: TType Bool
Run Code Online (Sandbox Code Playgroud)

我想要一个像这样的功能:

genTType :: Gen (TType a)
Run Code Online (Sandbox Code Playgroud)

哪个可以生成TType类型的随机构造函数.我可以通过创建存在的合格数据类型来实现这一点

data AnyType = forall a . MkAnyType (TType a)
Run Code Online (Sandbox Code Playgroud)

然后生成随机数01(包括)并AnyType根据整数值创建.像这样:

intToAnyType :: Int -> AnyType
intToAnyType 0 = MkAnyType TInt
intToAnyType 1 = MkAnyType TBool
intToAnyType _ = error "Impossible happened"
Run Code Online (Sandbox Code Playgroud)

但这种方法对我来说有几个缺点:

  1. 没有外部类型安全.如果我向TType数据类型添加另一个构造函数,我可能忘记修复测试,编译器不会警告我这一点.
  2. 编译器无法阻止我写作intToAnyType 1 = MkAnyType TInt.
  3. 我不喜欢这个error.Int类型太宽泛了我.让这种模式匹配详尽无遗是件好事.

我可以在Haskell中做些什么来消除尽可能多的缺点?最好使用此模块的发电机:

haskell type-safety gadt property-based-testing haskell-hedgehog

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

在Hedgehog中通过'Gen'或'forAll'生成随机输入之间的区别

假设,我想在Haskell Sumhedgehog库的帮助下测试以下的associativity属性:

a <> (b <> c) ? (a <> b) <> c
Run Code Online (Sandbox Code Playgroud)

我实际上有两种方法来生成随机输入.

1.生成全部Gen(使用Gen'Applicative和Monad实例)

genTriple :: Get (Int, Int, Int)
genTriple = liftA3 (,,) Gen.enumBounded Gen.enumBounded Gen.enumBounded

prop_assoc :: Property
prop_assoc = property $ do
  (a, b, c) <- forAll genTriple
  (Sum a <> Sum b) <> Sum c === Sum a <> (Sum b <> Sum c)
Run Code Online (Sandbox Code Playgroud)

2.生成每个字段 forAll

prop_assoc :: Property
prop_assoc = property $ do
  a <- forAll Gen.enumBounded …
Run Code Online (Sandbox Code Playgroud)

testing automated-tests haskell property-based-testing haskell-hedgehog

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

在ReaderT Monad Transformer中*的目的是什么?

我在看文档阅读器单子ReaderT单子转换.

相关定义是:

newtype ReaderT k r m a :: forall k. * -> (k -> *) -> k -> *
type Reader r = ReaderT * r Identity
Run Code Online (Sandbox Code Playgroud)

我不明白*在定义中做了什么.特别是我试图从ReaderT派生一个新的monad,其中IO作为基本monad,并且对r值有一个类约束.

我不确定为什么ReaderT(k)有第四个输入,以及当它将*放在该位置时Reader正在使用该值.

haskell monad-transformers

6
推荐指数
1
解决办法
178
查看次数

有没有人能够将liquidhaskell与nixos整合?

我正在尝试在NixOS上使用liquidhaskell.我可以安装包(liquidhaskell-0.8.2.3),虽然不是cabal集成,因为它需要cabal 1.18-1.25,但我有cabal 2.0.1.0.

我已经安装了liquidhaskell软件包作为ghc-with-packages设置的一部分:

[~:0]$ readlink $( type -p liquid )
/nix/store/pdbzl0p6k1klmajx969b6vvwyw9w0s6b-ghc-8.2.2-with-packages/bin/liquid
Run Code Online (Sandbox Code Playgroud)

在许多其他方面,包文本也安装在这个集合中:

[proclib:1]$ ls -ld /nix/store/pdbzl0p6k1klmajx969b6vvwyw9w0s6b-ghc-8.2.2-with-packages/lib/ghc-8.2.2/text-1.2.2.2/
dr-xr-xr-x 3 root root 68 Jan  1  1970 /nix/store/pdbzl0p6k1klmajx969b6vvwyw9w0s6b-ghc-8.2.2-with-packages/lib/ghc-8.2.2/text-1.2.2.2/
Run Code Online (Sandbox Code Playgroud)

但是液体看不出来:

[proclib:1]$ liquid ~/bin/h/nix.hs 
LiquidHaskell Version 0.8.2.3
Copyright 2013-18 Regents of the University of California. All Rights Reserved.

liquid: Main: Could not find module ‘Data.Text’
Perhaps you meant Data.Set (from containers-0.5.10.2)
Use -v to see a list of the files searched for.
Run Code Online (Sandbox Code Playgroud)

以上不是cabal包的一部分(试图从等式中消除阴谋).

我尝试过使用nix-shell来完成这项工作,但无论是nix-shell还是液体都会破坏语言编译指示:

[~:0]$ nix-shell -p myHaskellEnv --run liquid ~/bin/h/nix.hs 
/nix/store/q1cwqhb6v8yx8vy4s5p6sxrq8s0bnqmy-nix.hs: line 5: …
Run Code Online (Sandbox Code Playgroud)

haskell nixos liquid-haskell

6
推荐指数
1
解决办法
173
查看次数

如何克服Heroku上Haskell项目的构建时间限制?

我正在尝试使用以下buildpack将Haskell应用程序部署到Heroku:

进行良好,直到达到构建时间限制并出现以下错误:

-----> Timed out running buildpack Haskell
 !     Push failed
Run Code Online (Sandbox Code Playgroud)

有什么方法可以增加此限制或加快构建速度吗?

haskell build heroku limit

6
推荐指数
1
解决办法
153
查看次数

Idris 中类型的模式匹配

可能它是基本的,但我不明白为什么以下函数对于fnc Nat以及fnc Integer回答 1 ,它甚至没有作为模式包含在内。

fnc : Type -> Integer
fnc Bool = 1
fnc Nat = 2
Run Code Online (Sandbox Code Playgroud)

pattern-matching idris typecase

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

如何约束输入类型和输出类型是一样的?

我正在与Manning的Idris进行类型驱动开发.给出了一个示例,教导如何将函数限制为类型族中的给定类型.我们有Vehicle一个使用类型PowerSource要么是PedalPetrol,我们需要编写一个函数refill是typechecks仅适用于使用汽油作为其powersource车辆.

下面的代码有效,但不保证重新填充a Car会产生a Car而不是a Bus.如何更改refill函数的签名以仅允许Car在给定a Car和生成Bus时生成Bus

data PowerSource
  = Pedal
  | Petrol

data Vehicle : PowerSource -> Type 
  where
    Bicycle : Vehicle Pedal
    Car : (fuel : Nat) -> Vehicle Petrol
    Bus : (fuel : Nat) -> Vehicle Petrol

refuel : Vehicle Petrol -> Nat -> Vehicle Petrol
refuel (Car fuel) x        = Car (fuel + x)
refuel …
Run Code Online (Sandbox Code Playgroud)

type-safety dependent-type idris

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

构建 haskell 堆栈测试而不运行

我做了一个非常简单的项目,但测试套件失败了https://github.com/k-bx/noruntests-play

\n\n

现在,当我运行时,stack --test --no-run-tests build我希望它构建项目,但不运行测试。相反,它运行测试:

\n\n
\xe2\x9e\x9c  noruntests-play git:(master) stack --test --no-run-tests build\nnoruntests-play-0.1.0.0: test (suite: test)\n\ntest: error\nCallStack (from HasCallStack):\n  error, called at tests/Tests.hs:4:8 in main:Main\n\nTest suite failure for package noruntests-play-0.1.0.0\n    test:  exited with: ExitFailure 1\nLogs printed to console\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在这里做错了什么?谢谢你!

\n

haskell build-tools command-line-arguments haskell-stack

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