【发布时间】:2017-02-14 05:44:11
【问题描述】:
在我的作业中,我们得到了一个正则表达式。我必须返回 e-NFA。我正在尝试构建delta 函数。到目前为止,我有:
module ConsENFA where
import Data.Set (Set, fromList, singleton, empty)
import RegEx
import ENFA
epsilon :: RegExp Char
epsilon = Symbol 'e'
deltaTest :: RegExp Char -> Int -> (Int -> Char -> Set Int)
deltaTest (Symbol sym) start = delta
where
delta :: Int -> Char -> Set Int
delta start sym = singleton (start + 1)
deltaTest (Star re) start = delta
where
delta :: Int -> Char -> Set Int
delta = deltaTest re (start + 1)
delta start epsilon = fromList[1, 3]
我收到了错误
ConsENFA.hs:19:9: error:
Conflicting definitions for `delta'
Bound at: ConsENFA.hs:19:9-13
ConsENFA.hs:20:9-13
我认为这意味着我不能像那样扩展模式匹配,我不能添加更多状态。
我首先为单个标签定义delta,然后在之前定义的delta 中添加更多定义,但它不起作用。正确的做法是什么?
【问题讨论】:
-
实际错误是由于
delta被定义为deltaTest的第二个等式中的arity 0 和arity 2 的函数。目前尚不清楚实际定义应该是什么。另一个(未报告的)错误是尝试使用epsilon的值作为模式匹配的一部分。 -
@chepner
epsilon的使用不应引发错误;这只是名称阴影。这可能是无意的,但这不是编译错误。 -
一个快速的search of StackOverflow 找到了其他拥有same problem 的人。
-
@crockeea 我会假装这就是我所说的未报告的意思:)
-
@crockeea 抱歉,我在搜索中尝试了很多关键字,但由于我不知道正确的术语而找不到答案。
标签: function haskell recursion