小编tvy*_*ynr的帖子

变形金刚下的转型

我现在对monad变形金刚有点困难.我正在定义一些利用变压器的不同的非确定性关系.不幸的是,我无法理解如何从一个有效的模型转换到另一个有效的模型.

假设这些关系是"foo"和"bar".假设"foo"将As和Bs与Cs联系起来; 假设"bar"将Bs和Cs与Ds联系起来.我们将用"foo"来定义"bar".为了使事情变得更有趣,这些关系的计算将以不同的方式失败.(由于条形关系取决于foo关系,因此其失败情况是超集.)因此,我给出以下类型定义:

data FooFailure = FooFailure String
data BarFailure = BarSpecificFailure | BarFooFailure FooFailure
type FooM = ListT (EitherT FooFailure (Reader Context))
type BarM = ListT (EitherT BarFailure (Reader Context))
Run Code Online (Sandbox Code Playgroud)

我希望能够用以下函数签名编写关系:

foo :: A -> B -> FooM C
bar :: B -> C -> BarM D
Run Code Online (Sandbox Code Playgroud)

我的问题是,写"酒吧"的定义的时候,我需要能够从"富"的关系接收错误和正确地表示他们在"酒吧"的空间.所以我可以使用表单的功能

convert :: (e -> e') -> ListT (EitherT e (Reader Context) a
                     -> ListT (EitherT e' (Reader Context) a
Run Code Online (Sandbox Code Playgroud)

我甚至可以通过运行ListT,在EitherT上映射,然后重新组装ListT来编写那个小野兽(因为它发生m [a]可以转换为ListT ma).但这似乎......凌乱.

有一个很好的理由我不能只运行变压器,在它下面做一些东西,并且通常"把它放回去"; 我跑的变压器可能有效果,我不能神奇地撤消它们.但是有一些方法我可以将一个函数提升到变压器堆栈中,为我做一些工作,所以我不必编写convert上面显示的函数吗?

monads haskell lifting

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

Python select()行为很奇怪

我在理解select.select的行为时遇到了一些麻烦.请考虑以下Python程序:

def str_to_hex(s):
    def dig(n):
        if n > 9:
            return chr(65-10+n)
        else:
            return chr(48+n)
    r = ''
    while len(s) > 0:
        c = s[0]
        s = s[1:]
        a = ord(c) / 16
        b = ord(c) % 16
        r = r + dig(a) + dig(b)
    return r

while True:
    ans,_,_ = select.select([sys.stdin],[],[])
    print ans
    s = ans[0].read(1)
    if len(s) == 0: break
    print str_to_hex(s)
Run Code Online (Sandbox Code Playgroud)

我已将其保存到文件"test.py".如果按如下方式调用它:

echo 'hello' | ./test.py
Run Code Online (Sandbox Code Playgroud)

然后我得到了预期的行为:选择never块并打印所有数据; 程序然后终止.

但如果我以交互方式运行程序,我会得到一个最不受欢迎的行为.请考虑以下控制台会话:

$ ./test.py
hello
[<open file '<stdin>', mode 'r' at …
Run Code Online (Sandbox Code Playgroud)

python unix linux io

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

标签 统计

haskell ×1

io ×1

lifting ×1

linux ×1

monads ×1

python ×1

unix ×1