小编Joe*_*get的帖子

liftM,lilftA等之间的首选

最近我一直在编写FFI代码,它返回IO monad中的数据结构.例如:

peek p = Vec3 <$> (#peek aiVector3D, x) p
              <*> (#peek aiVector3D, y) p
              <*> (#peek aiVector3D, z) p
Run Code Online (Sandbox Code Playgroud)

现在我可以想到编写代码的四种不错的方法,所有这些都密切相关:

peek p = Vec3 <$> io1 <*> io2 <*> io3
peek p = liftA3 Vec3 io1 io2 io3
peek p = return Vec3 `ap` io1 `ap` io2 `ap` io3
peek p = liftM3 Vec3 io1 io2 io3
Run Code Online (Sandbox Code Playgroud)

请注意,我要求的monadic代码除了Applicative提供的内容之外不需要任何其他内容.编写此代码的首选方法是什么?我应该Applicative用来强调代码的作用,或者我应该使用Monad它,因为它可能(?)有优化Applicative

现在的问题是轻微的事实,只有复杂的[liftA..liftA3][liftM..liftM5],但我有几个记录超过三个或五个成员,所以如果我决定去与lift{A,M}我失去了一些一致性,因为我将不得不使用不同的方法,对于较大的记录.

haskell

16
推荐指数
1
解决办法
695
查看次数

压缩遍历

我有一个Traversable漏洞 - 想象一下这个二叉树:

         /       \
       /    \     Nothing
 Just 1    /  \  
    Nothing   Just 3
Run Code Online (Sandbox Code Playgroud)

我还有一个值列表来填补 - [2, 4]- 导致:

         /       \
       /    \     Just 4
 Just 1    /  \  
     Just 2   Just 3
Run Code Online (Sandbox Code Playgroud)

我认为可以使用lens索引遍历遍历Nothings并用列表中相应索引处的值替换它们.

但是必须可以在不使用指数的情况下直接做更多的事情吗?

奖励积分 - 此主题的一些变化:

  1. (我的用例)值列表必须与遍历中的孔具有完全相同的元素数.失败表示一个Maybe.
  2. 名单必须有至少尽可能多的元素,所以我们也可以通过在[2, 4, 6],[2, 4, ..]等等.
  3. 列表可以包含任意数量的元素,并且我们可以使用我们给出的元素填充尽可能多的孔.此操作不会失败,它只能填充任意数量的孔.

haskell haskell-lens

9
推荐指数
2
解决办法
120
查看次数

OS X辅助功能API最小宽度

我找到了另一个问题和答案,解释了如何使用Accessibility API获取窗口的宽度,高度和位置.有没有办法找到最小尺寸,最大尺寸,调整大小增量等?

编辑:

我目前的方法是使用,AXUIElementCopyAttributeValue但我不确定这是可能的.查看参考文献,您可以看到我可以访问很多属性,但我找不到窗口的最小或最大大小.请注意,通过此API可以访问位置.

现在我还在查看一些名为Son of Grab的示例代码,它也可以访问窗口大小和位置,但我不相信该方法适用于最小或最大大小.

macos layout cocoa objective-c

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

Coq平等实施

我正在写一种玩具语言,其中AST中的节点可以有任意数量的子节点(Num有0,Arrow有2等).你可以称这些运营商.另外,AST中的一个节点可能是"聚焦"的.我们将数据类型编入索引,Z如果它具有焦点,或者H如果没有焦点.

我需要有关代码的一些部分的建议.希望一下子就可以问所有这些,因为它们是相关的.

  1. 如何用一个焦点定义内部节点的类型InternalZ?现在我说"我们有S n孩子 - n他们没有专注,一个(在一些指定的指数)是专注的.一个稍微更直观的选择(看起来像拉链)将是InternalZ : forall n m, arityCode (n + 1 + m) -> Vector.t (t H) n -> t Z -> Vector.t (t H) m -> t Z.我知道我不想处理但是,这个补充.

  2. 精炼类型:在两个有趣的案例中eq我比较两个ns(孩子的数量).如果它们是相同的,我应该能够"强制" arityCodes和Vector.ts具有相同的类型.现在我用两个引理来攻击这个.我该怎么做呢?似乎Adam Chlipala的"护航模式"可能有所帮助,但我无法弄清楚如何.

  3. 如果我取消注释任何一个Vector.eqb调用,Coq会抱怨"无法猜测减少修正的论点.".我理解错误,但我不确定如何规避错误.我想到的第一件事就是我可能需要t根据孩子的深度进行索引.

我的代码:

Module Typ.
  Import Coq.Arith.EqNat.
  Import Coq.Structures.Equalities.
  Import Coq.Arith.Peano_dec.
  Import Fin.
  Import Vector.

  (* h: unfocused, …
Run Code Online (Sandbox Code Playgroud)

coq

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

使用没有"get"功能的状态monad

这个关于镜头好文章加布里埃尔·冈萨雷斯写这样的代码:

import Control.Monad.Trans.Class
import Control.Monad.Trans.State

strike :: StateT Game IO ()
strike = do
        lift $ putStrLn "*shink*"
        boss.health -= 10
Run Code Online (Sandbox Code Playgroud)

但后来写道

newState^.boss.health
Run Code Online (Sandbox Code Playgroud)

我知道为了修改Statemonad(这里是StateTmonad变换器)你需要使用get函数获取状态,用它做一些事情,然后使用该put函数.但是这里作者没有使用这些功能.同样在第二个例子中,他使用^操作符,这意味着使用boss镜头需要一个Game值.但他在第一个例子中没有这样做.怎么样?

haskell

3
推荐指数
1
解决办法
89
查看次数

是否可以在同一实体组中使用db模型和ndb模型?

我们有一个db模型,Vote我们已经使用了一段时间,最近添加了一个ndb模型,Score它代表了一个实体的累积分数,基于它的投票.目前Score是其投票的父级,因为我们希望它们都在同一个实体组中(因此可以在同一个事务中更新它们).我一直试图让一个交易工作,这将更新两个Vote,Score但它一直失败.这是一些示例代码:

    def transaction():
        score = self.key_score.get()
        vote = db.get(self.key_vote)

        # do stuff

        score.put()
        vote.put()
    db.run_in_transaction(transaction)
Run Code Online (Sandbox Code Playgroud)

从我所知道的(仅限dev服务器),这总是重试四次:

WARNING:root:Transaction collision. Retrying...
WARNING:root:Transaction collision. Retrying...
WARNING:root:Transaction collision. Retrying...
WARNING:root:Transaction collision. Retrying...
ERROR
Run Code Online (Sandbox Code Playgroud)

然后我得到"TransactionFailedError:交易无法提交.请再试一次.".

我已经尝试了一些方法来解决这个问题:

  1. 更改获取和放置的顺序 - 我想也许有一个实体组锁定问题,我不明白,但切换获取或放置的顺序并没有改变行为.

  2. 异步投入.这实际上就是我开始的 - 我知道同时放置db和ndb模型的唯一方法(我认为这实际上是在幕后放置多个键的原因).结果相同.

    score_future = score.put_async()
    vote_future = db.put_async(vote)
    score_future.get_result()
    vote_future.get_result()
    
    Run Code Online (Sandbox Code Playgroud)
  3. 替换db.run_in_transactionndb.transaction.抛出"AttributeError:'Key'对象没有属性'reference'" db.get.我不确定这里发生了什么 - 看起来一些幕后代码正在db.Key达到预期的水平ndb.Key.

有趣的是,如果删除parent关系,我可以运行与上面相同的代码,这意味着实体不在同一个实体组中.

那么,是否可以在同一个实体组中同时使用db和ndb模型?也许有一种简单的方法可以将db模型作为ndb,反之亦然?

google-app-engine app-engine-ndb

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

Coq严格的积极性令人费解

我正在使用带有术语,变量和nat文字的语言进行开发,其中语言的arity构造在预定义中:

Inductive sort : Set := TERM | VAR | NAT.

Inductive termArity : list sort -> Set :=
  | Var    : termArity [VAR]
  | Let    : termArity [VAR ; TERM ; TERM]
  | Lam    : termArity [VAR ; TERM]
  | Ap     : termArity [TERM ; TERM]
  | NumLit : termArity [NAT]
  | Plus   : termArity [TERM ; TERM]
  .
Run Code Online (Sandbox Code Playgroud)

我想要使​​用的术语的定义包含一个在其arity规范中匹配每个类型的子项(hlist是来自CPDT的异构列表):

Inductive t : Type :=
| Node : forall (sorts : list sort) (code : termArity sorts),
    hlist (fun …
Run Code Online (Sandbox Code Playgroud)

coq

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