【发布时间】:2017-04-06 00:54:15
【问题描述】:
我在 Udacity 上关注“编程语言”,并尝试在 Haskell 中表示问题集。答案是用 Python 写的:
edges = {(1,"a") : [2,3]
,(2,"a") : [2]
,(3,"b") : [3,4]
,(4,"c") : [5]}
accepting = [2,5]
def nfsmSim(string, current, edges, accepting):
if string == "":
return current in accepting
else:
letter = string[0]
key = (current, letter)
if key in edges:
rest = string[1:]
states = edges[key]
for state in states:
if nfsmSim(rest, state, edges, accepting):
return True
return False
起始状态始终是第一个状态,即current = 1。
"aaa" 或 "abc" 等字符串被接受,而 "abb" 或 "aabc" 或被拒绝。
我尝试使用 Haskell 重写:
nfsmSim [] c _ = [c]
nfsmSim xs c es = [concat $ nfsmSim (tail xs) s es | (k,ss) <- es, s <- ss, x <- xs, k==(c,x)]
我想返回一个整数列表,这些整数表示输入字符串末尾的最后一个状态,然后filter 这些与接受状态相对应,并使用any 得到最终的True 或False。
我意识到这可能不是 Haskell 执行此操作的方法,并且可能有更好的 wholemeal 解决方案。然而,作为一个初学者,我正在与 mondadic 机制作斗争,而且很可能是这个问题的递归性质。
请可能使用do 表示法而不是列表理解为我指出正确的方向。
【问题讨论】:
-
如果可能的话,您能否添加一个练习链接?
-
@Zeta programming languages
标签: python haskell recursion functional-programming monads