我已经整理了一个小测试用例来演示我的问题:
package P1;
use Moose;
use MooseX::Storage;
with Storage;
has 'blah' => (
is => 'rw',
);
package P2;
use Moose;
use MooseX::Storage;
with Storage;
has 'lol' => (
is => 'rw',
traits => ['DoNotSerialize']
);
package P3;
use Moose;
extends 'P2';
has 'magic' => (
is => 'rw',
);
package Test;
my $obj = P3->new(
magic => 'This ok!',
lol => sub { 'weee' }
);
my $stored = P1->new(blah => $obj);
use Data::Dumper; print Dumper ($stored->pack);
Run Code Online (Sandbox Code Playgroud)
我希望这打印对象,但不打包P2包中的'lol'属性 - …
请注意,随后发布此问题我自己设法得到了一个解决方案.请参阅此问题的结尾以获取最终答案.
我正在为org-mode文档开发一个小解析器,在这些文档中,标题可以有一个标题,并且可以选择包含标题的标签列表:
* Heading :foo:bar:baz:
Run Code Online (Sandbox Code Playgroud)
但是,我在为此编写解析器时遇到了困难.以下是我现在正在使用的内容:
import Control.Applicative
import Text.ParserCombinators.Parsec
data Node = Node String [String]
deriving (Show)
myTest = parse node "" "Some text here :tags:here:"
node = Node <$> (many1 anyChar) <*> tags
tags = (char ':') >> (sepEndBy1 (many1 alphaNum) (char ':'))
<?> "Tag list"
Run Code Online (Sandbox Code Playgroud)
虽然我的简单tags解析器工作,但它不能在上下文中工作,node因为所有字符都用完了解析标题(many1 anyChar)的标题.此外,我无法更改此解析器以使用,noneOf ":"因为:在标题中有效.实际上,如果它位于标记列表中,那么它就是特殊的.
我有什么想法可以解析这个可选数据?
顺便说一句,这是我的第一个真正的Haskell项目,所以如果Parsec甚至不是适合这项工作的工具 - 请随意指出并提出其他选择!
好的,我现在得到了一个完整的解决方案,但它需要重构.以下作品:
import Control.Applicative hiding (many, optional, (<|>))
import Control.Monad
import Data.Char (isSpace)
import …Run Code Online (Sandbox Code Playgroud) 在Associated Type Synonyms(Chakravarty,Keller,Jones)中,该论文似乎表明以下内容是有效的:
class C a where
type S a (k :: * -> *) :: *
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行它时,我得到一个编译器错误(带-XTypeFamilies):
Not in scope: type variable `k'
Run Code Online (Sandbox Code Playgroud)
我错过了什么,或者GHC中的实际实现与文中提到的不一样?
我正在尝试从Haskell应用程序与Basler USB3相机接口,但我遇到了一些困难.相机附带了一个C++库,使其非常直接.以下代码可用于获取摄像机源:
extern "C" {
void basler_init() {
PylonAutoInitTerm pylon;
CInstantCamera camera( CTlFactory::GetInstance().CreateFirstDevice());
camera.RegisterConfiguration( (CConfigurationEventHandler*) NULL, RegistrationMode_ReplaceAll, Cleanup_None);
cout << "Using device " << camera.GetDeviceInfo().GetModelName() << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经使用这个源代码来构建一个共享库 - libbasler.so.为了确认它的工作原理,这里有一个基本的C程序,它连接它并确认一切正常:
void basler_init();
int main () {
basler_init();
}
Run Code Online (Sandbox Code Playgroud)
我编译并运行它:
$ gcc Test2.c -lbasler -Llib -Wl,--enable-new-dtags -Wl,-rpath,pylon5/lib64 -Wl,-E -lpylonbase -o Test2-c
$ PYLON_CAMEMU=1 LD_LIBRARY_PATH=lib ./Test2-c
Using device Emulation
Run Code Online (Sandbox Code Playgroud)
这是预期的产出.
但是,当我尝试将其与Haskell一起使用时,行为会发生变化,程序会无限期地阻塞.这是Haskell源代码:
{-# LANGUAGE ForeignFunctionInterface #-}
foreign import ccall "basler_init" baslerInit :: IO ()
main :: IO ()
main = …Run Code Online (Sandbox Code Playgroud) 我最近才开始研究我最新的Haskell项目,并且非常想测试它.我想知道目前测试的位置,关于最前沿的框架,测试运行程序和测试代码组织.似乎以前的测试只是一个单独的二进制文件,如果测试通过或失败,它会返回不同的退出代码 - 这仍然是当前采用的设置,还是现在还有其他方法可以与cabal集成?
我正在开发一个包含monoid的应用程序仿函数来"查看"执行.然而,有时我根本不关心这一部分,因此选择monoid是无关紧要的,因为它永远不会被消耗掉.我简化了我的所作所为:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
import GHC.Exts
class Render a b where render :: a -> b
instance Render a () where render = const ()
class Merge a where
type Renderer a b :: Constraint
merge :: Renderer a b => a -> b
data Foo = Foo Bool
instance Merge Foo where
type (Renderer Foo) m = (Render Bool m)
merge (Foo b) = render b …Run Code Online (Sandbox Code Playgroud) 我正在做第一部分真正的工作smallcheck,我对如何使用Depth参数感到有些困惑.在我进入之前,让我说明我正在使用smallcheck的内容.
在工作中,我们正在我们自己的内部数据库前构建一个简单的Web服务.Web服务执行一些查询,并将查询结果序列化为JSON进行响应.我目前正在研究的是保证:给定一个表示查询结果的对象,该对象产生预期的JSON.例如:
data Action
= Action { actionType :: !ActionType
, actionDescription :: !Text
, actionPerformedAt :: !UTCTime
, actionAgentName :: !Text
}
Run Code Online (Sandbox Code Playgroud)
必须生成JSON,例如:
{
"type": "Booking",
"description": "Whatever",
"performedAt": "2012-01-04",
"agent": "Tom"
}
Run Code Online (Sandbox Code Playgroud)
这看起来像是一个理想的任务smallcheck,我将其表述如下:
testAction :: Tasty.TestTree
testAction = Tasty.testGroup "Action"
[ SmallCheck.testProperty "type" $
SmallCheck.over actions $ match $
Aeson.key "type" --> Aeson.toJSON . actionType
, SmallCheck.testProperty "dateActioned" $
SmallCheck.over actions $ match $
Aeson.key "dateActioned" --> expectedUTCTimeEncoding . actionPerformedAt …Run Code Online (Sandbox Code Playgroud) 众所周知,在分析 Haskell 应用程序时,所有依赖项都已安装有分析信息。这是好的,但与具有哈斯克尔包一个问题出现-auto-all在他们的.cabal文件。这意味着我将永远看到他们的分析信息,即使这与我无关。
请允许我举一个例子,说明这是有问题的。我正在构建一个小游戏引擎,并且在我的游戏循环加载纹理等之前我做了很多工作JuicyPixels。这不是分析有趣的代码 - 我对分析游戏循环本身很感兴趣。但是,由于使用JuicyPixels构建自身-auto-all,因此似乎没有办法从分析中排除此信息。结果,我最终得到了数百条只是噪音的分析线。
是否可以去除所有JuicyPixel调试信息(或任何库,在一般情况下)?
我正在研究绑定到Web服务,其中一些调用采用标志来返回其他信息.例如,通过ID获取艺术家可以使用"录音"标志返回艺术家的录音,并且通过ID获取发行也可以获取录音标记以获得该发行的所有音轨录音.但是,在获取艺术家时,您可以获得该艺术家的所有版本,但是当您实际获得特定版本时,此标志无效.
因此要将其编码到Haskell中,以下内容应该是有效的程序:
getArtistById 5678 [ WithRecordings ]
getReleaseById 37837 [ WithRecordings ]
Run Code Online (Sandbox Code Playgroud)
以下应该是一个无效的程序,并且无法构建:
getReleaseById 739 [ WithReleases ]
Run Code Online (Sandbox Code Playgroud)
我想到了一些解决方案,但我不确定应该采取哪些措施.浮现在脑海的第一个念头是使用类型类ArtistFlag和ReleaseFlag,但是这并不几个原因是有意义的.首先,ArtistFlag f => [f]表示同一个标志的列表,这是有缺陷的.而且,类型类意味着将来添加额外标志的能力,这也没有多大意义 - 有一定数量的标志.
我的下一个选项是每个端点标志的单独数据声明:
data ArtistFlag = ArtistWithRecordings | ArtistWithReleases
data ReleaseFlag = ReleaseWithRecordings
Run Code Online (Sandbox Code Playgroud)
这有点笨拙 - 理想情况下*WithRecordings应始终使用相同的名称,以简化程序员的API.
最后,这是我由于缺乏知识而没有探索过的唯一选择,这可能是HList可以解决的.getArtistById应该采用一组异类的艺术家旗帜.我不知道如何在HList中表达这个,或者即使它可以做到这一点.
很想听到打字大师不得不说:)
我正在实现的API的实际部分位于http://musicbrainz.org/doc/XML_Web_Service/Version_2#Subqueries - 注意recordings标志等.
我有以下程序:
{-# language MultiParamTypeClasses #-}
{-# language PolyKinds #-}
{-# language QuantifiedConstraints #-}
{-# language RankNTypes #-}
{-# language ScopedTypeVariables #-}
{-# language TypeApplications #-}
{-# language UndecidableInstances #-}
module Control.IO.GWeave where
import Generics.Kind
newtype HigherOrder e m a =
HigherOrder ( e m a )
weaveFromTo
:: forall m n e a code.
( GenericK e ( LoT2 n a )
, GenericK e ( LoT2 m a )
, GWeave ( RepK e ) m n ( LoT2 …Run Code Online (Sandbox Code Playgroud)