最近我一直在编写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}
我失去了一些一致性,因为我将不得不使用不同的方法,对于较大的记录.
我有一个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
索引遍历遍历Nothing
s并用列表中相应索引处的值替换它们.
但是必须可以在不使用指数的情况下直接做更多的事情吗?
奖励积分 - 此主题的一些变化:
Maybe
.[2, 4, 6]
,[2, 4, ..]
等等.我找到了另一个问题和答案,解释了如何使用Accessibility API获取窗口的宽度,高度和位置.有没有办法找到最小尺寸,最大尺寸,调整大小增量等?
编辑:
我目前的方法是使用,AXUIElementCopyAttributeValue
但我不确定这是可能的.查看参考文献,您可以看到我可以访问很多属性,但我找不到窗口的最小或最大大小.请注意,通过此API可以访问位置.
现在我还在查看一些名为Son of Grab的示例代码,它也可以访问窗口大小和位置,但我不相信该方法适用于最小或最大大小.
我正在写一种玩具语言,其中AST中的节点可以有任意数量的子节点(Num
有0,Arrow
有2等).你可以称这些运营商.另外,AST中的一个节点可能是"聚焦"的.我们将数据类型编入索引,Z
如果它具有焦点,或者H
如果没有焦点.
我需要有关代码的一些部分的建议.希望一下子就可以问所有这些,因为它们是相关的.
如何用一个焦点定义内部节点的类型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
.我知道我不想处理但是,这个补充.
精炼类型:在两个有趣的案例中eq
我比较两个n
s(孩子的数量).如果它们是相同的,我应该能够"强制" arityCode
s和Vector.t
s具有相同的类型.现在我用两个引理来攻击这个.我该怎么做呢?似乎Adam Chlipala的"护航模式"可能有所帮助,但我无法弄清楚如何.
如果我取消注释任何一个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) 在这个关于镜头好文章加布里埃尔·冈萨雷斯写这样的代码:
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)
我知道为了修改State
monad(这里是StateT
monad变换器)你需要使用get
函数获取状态,用它做一些事情,然后使用该put
函数.但是这里作者没有使用这些功能.同样在第二个例子中,他使用^
操作符,这意味着使用boss
镜头需要一个Game
值.但他在第一个例子中没有这样做.怎么样?
我们有一个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:交易无法提交.请再试一次.".
我已经尝试了一些方法来解决这个问题:
更改获取和放置的顺序 - 我想也许有一个实体组锁定问题,我不明白,但切换获取或放置的顺序并没有改变行为.
异步投入.这实际上就是我开始的 - 我知道同时放置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)替换db.run_in_transaction
为ndb.transaction
.抛出"AttributeError:'Key'对象没有属性'reference'" db.get
.我不确定这里发生了什么 - 看起来一些幕后代码正在db.Key
达到预期的水平ndb.Key
.
有趣的是,如果删除parent
关系,我可以运行与上面相同的代码,这意味着实体不在同一个实体组中.
那么,是否可以在同一个实体组中同时使用db和ndb模型?也许有一种简单的方法可以将db模型作为ndb,反之亦然?
我正在使用带有术语,变量和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)