小编Ale*_*ong的帖子

为什么迭代器在Python文档中被认为是函数式的?

我试图理解迭代器.我注意到Python文档认为迭代器是一个功能样式的构造.我真的不明白.

迭代器里面有一个状态是不是真的.所以当你调用时it.__next__(),你会改变迭代器的状态.据我所知,对象的变异状态不被认为是功能性的,因为函数式编程强调对象/闭包的不变性和组合能力.

实际上,问题出现了,因为我想编写一个Scheme过程/函数,它接受令牌并返回一个迭代器.

(define tokens->iterator
  (lambda ls
    (lambda ()
      (if (null? ls)
          '*eoi*
          (let ((tok (car ls)))
            (set! ls (cdr ls))
            tok)))))
Run Code Online (Sandbox Code Playgroud)

请注意我必须使用set!变异ls,这就是我提出这个问题的方法.

要使用它,

(define it (tokens->iterator 1 '+ 2))
Run Code Online (Sandbox Code Playgroud)

要测试它,

scheme@(guile-user)> (it)
$2 = 1
scheme@(guile-user)> (it)
$3 = +
scheme@(guile-user)> (it)
$4 = 2
scheme@(guile-user)> (it)
$5 = *eoi*
scheme@(guile-user)> (it)
$6 = *eoi*
Run Code Online (Sandbox Code Playgroud)

只是为了好玩,我还将其翻译成Python:

def tokens_to_iterator(*tup):
    ls = list(tup)
    def iterator():
        if not ls:
            return "*eoi*"
        else:
            tok = …
Run Code Online (Sandbox Code Playgroud)

python scheme iterator

11
推荐指数
2
解决办法
462
查看次数

IORef仍然引用更新后的旧值

背景

我是一名开始学习Haskell的Schemer.我正在尝试在SICP的第4章之后在C中实现Scheme解释器.事实证明直接用C编程太难了.所以我决定先在Haskell中进行原型设计.在48小时内自己编写一个方案的帮助下,我已经实现了除变量,闭包和环境之外的所有功能.

问题

修改IORef不会在调用之间持续存在main.我希望程序打印(False)(True)(True)(True) ...但实际上它打印(False)(True)(False)(True)(False)(True) ...

代码的精简版:

import Data.IORef

data SCM = Environment (IORef Bool) SCM | Empty'Environment

global :: IO SCM
global = Environment <$> newIORef False <*> pure Empty'Environment

print'' :: SCM -> IO ()
print'' ls =
  case ls of
    Empty'Environment -> pure ()
    Environment first rest -> readIORef first >>= putStr . show >> print'' rest

print' :: SCM -> IO ()
print' ls = putStr …
Run Code Online (Sandbox Code Playgroud)

io scheme haskell ioref

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

标签 统计

scheme ×2

haskell ×1

io ×1

ioref ×1

iterator ×1

python ×1