gpt4 book ai didi

python - 如何轻松地从 Haskell 过渡到 Python 3

转载 作者:行者123 更新时间:2023-11-28 20:05:37 25 4
gpt4 key购买 nike

所以我为我的大学家庭作业编写了一些非常漂亮的 Haskell 代码,但发现他们不打算支持 Haskell 用于我们的家庭作业。

我收到一封电子邮件,说我应该尝试 Python,因为在所有支持的语言中,它具有最多的“功能”。

我尝试了一些将代码快速转换为 Python 的代码,但我有点困惑是否真的必须看起来这么丑。

所以我的 Haskell 代码是

transitions = map (map (splitOn ",")) $ map (splitOn "->") $ drop 5 $ input'

我的python3代码是

transitions = list(map(lambda x: list(map(lambda y: y.split(","), x)), map(lambda z: z.split("->"), lined_input[5:])))

因为到目前为止我已经写了大约 10 行 python,我有点希望我错过了一个更好的方法来处理这些事情。

最让我困扰的是有时我必须使用 x.split 并且 map 必须是 map(f, x)。

有没有更好的方法来解决这个问题?

最佳答案

我不建议像这样编写 Python 代码,因为 Python 使用列表理解和其他技术使这类事情变得更好,但如果你真的想以函数式风格编写它,你可以这样做

import string
from functools import *
from itertools import *

def take(n, iterable): return islice(iterable, n)
def drop(n, iterable): return islice(iterable, n, None)

def splitOn(sep): return partial(string.split, sep=sep)

transitions = imap(splitOn(','), chain(*imap(splitOn('->'), drop(5, input))))

如您所知,这非常困惑。一个更 pythonic 的解决方案可能是

transitions = (c for a in drop(5, input)
for b in a.split('->')
for c in b.split(','))

这甚至是我认为正则表达式可以接受的情况:

import re

def splitOn(*seps): return partial(re.split, '|'.join(re.escape(sep) for sep in seps))

transitions = imap(splitOn(',', '->'), drop(5, input))

我仍然能够使用函数式技术,例如映射、通用取/放、部分应用和推导式,但使用更多 Python 功能会更清晰。对于简单的情况,我最喜欢的是简单的生成器理解,但如果您需要更多定界符,最后一个很好。

关于python - 如何轻松地从 Haskell 过渡到 Python 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29083463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com