我有一个枚举类型,例如
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库来实现类似的代码并满足以下要求?
MyType应该隐式传递。HasMyType未指定约束,MyType则应采用默认值。HasMyType在一个地方覆盖通过约束传递的值,例如在应用程序的开头。这样的事情可能吗?或者使用reflection库最接近的近似值是什么?
当我: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实现应用类型默认规则后将如何更改类型?
我有像这样的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)
然后生成随机数0到1(包括)并AnyType根据整数值创建.像这样:
intToAnyType :: Int -> AnyType
intToAnyType 0 = MkAnyType TInt
intToAnyType 1 = MkAnyType TBool
intToAnyType _ = error "Impossible happened"
Run Code Online (Sandbox Code Playgroud)
但这种方法对我来说有几个缺点:
TType数据类型添加另一个构造函数,我可能忘记修复测试,编译器不会警告我这一点.intToAnyType 1 = MkAnyType TInt.error.Int类型太宽泛了我.让这种模式匹配详尽无遗是件好事.我可以在Haskell中做些什么来消除尽可能多的缺点?最好使用此模块的发电机:
haskell type-safety gadt property-based-testing haskell-hedgehog
假设,我想在Haskell Sum的hedgehog库的帮助下测试以下的associativity属性:
a <> (b <> c) ? (a <> b) <> c
Run Code Online (Sandbox Code Playgroud)
我实际上有两种方法来生成随机输入.
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)
forAllprop_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
相关定义是:
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正在使用该值.
我正在尝试在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) 我正在尝试使用以下buildpack将Haskell应用程序部署到Heroku:
进行良好,直到达到构建时间限制并出现以下错误:
-----> Timed out running buildpack Haskell
! Push failed
Run Code Online (Sandbox Code Playgroud)
有什么方法可以增加此限制或加快构建速度吗?
可能它是基本的,但我不明白为什么以下函数对于fnc Nat以及fnc Integer回答 1 ,它甚至没有作为模式包含在内。
fnc : Type -> Integer
fnc Bool = 1
fnc Nat = 2
Run Code Online (Sandbox Code Playgroud) 我正在与Manning的Idris进行类型驱动开发.给出了一个示例,教导如何将函数限制为类型族中的给定类型.我们有Vehicle一个使用类型PowerSource要么是Pedal或Petrol,我们需要编写一个函数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) 我做了一个非常简单的项目,但测试套件失败了https://github.com/k-bx/noruntests-play
\n\n现在,当我运行时,stack --test --no-run-tests build我希望它构建项目,但不运行测试。相反,它运行测试:
\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\nRun Code Online (Sandbox Code Playgroud)\n\n我在这里做错了什么?谢谢你!
\nhaskell ×8
idris ×2
type-safety ×2
build ×1
build-tools ×1
gadt ×1
ghci ×1
heroku ×1
limit ×1
nixos ×1
polymorphism ×1
reflection ×1
testing ×1
typecase ×1
typeclass ×1
types ×1