小编och*_*les的帖子

为什么MooseX :: Storage似乎不遵循某些对象的属性特征?

我已经整理了一个小测试用例来演示我的问题:

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'属性 - …

perl serialization moose

6
推荐指数
2
解决办法
337
查看次数

最后用可选数据解析文本

请注意,随后发布此问题我自己设法得到了一个解决方案.请参阅此问题的结尾以获取最终答案.


我正在为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)

parsing haskell parsec

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

是否可以使用类型类中未提及的变量的关联类型同义词?

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 types

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

通过FFI块从Haskell调用共享库,而在从C程序链接时则不会

我正在尝试从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)

c c++ haskell ffi

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

处理Haskell测试的最现代方法是什么?

我最近才开始研究我最新的Haskell项目,并且非常想测试它.我想知道目前测试的位置,关于最前沿的框架,测试运行程序和测试代码组织.似乎以前的测试只是一个单独的二进制文件,如果测试通过或失败,它会返回不同的退出代码 - 这仍然是当前采用的设置,还是现在还有其他方法可以与cabal集成?

testing haskell

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

使用具有"有限"约束的约束种类和类型族

我正在开发一个包含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)

haskell type-families constraint-kinds

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

在smallcheck中控制`Depth`参数应该多少?

我正在做第一部分真正的工作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 smallcheck

5
推荐指数
2
解决办法
355
查看次数

分析 Haskell 代码但不包括库分析信息

众所周知,在分析 Haskell 应用程序时,所有依赖项都已安装有分析信息。这是好的,但与具有哈斯克尔包一个问题出现-auto-all在他们的.cabal文件。这意味着我将永远看到他们的分析信息,即使这与我无关。

请允许我举一个例子,说明这是有问题的。我正在构建一个小游戏引擎,并且在我的游戏循环加载纹理等之前我做了很多工作JuicyPixels。这不是分析有趣的代码 - 我对分析游戏循环本身很感兴趣。但是,由于使用JuicyPixels构建自身-auto-all,因此似乎没有办法从分析中排除此信息。结果,我最终得到了数百条只是噪音的分析线。

是否可以去除所有JuicyPixel调试信息(或任何库,在一般情况下)?

profiling haskell libraries

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

如何将带有标志的类型系统用于有时共享的函数,有时是独占的?

我正在研究绑定到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)

我想到了一些解决方案,但我不确定应该采取哪些措施.浮现在脑海的第一个念头是使用类型类ArtistFlagReleaseFlag,但是这并不几个原因是有意义的.首先,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标志等.

haskell types

2
推荐指数
1
解决办法
104
查看次数

尽管在量化约束中提到了GHC,但无法推断出实例存在

我有以下程序:

{-# 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)

haskell

2
推荐指数
1
解决办法
112
查看次数