在我的作业中,我们得到了正则表达式。我必须退回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
添加更多定义,但它不起作用。这样做的正确方法是什么?
答案 0 :(得分:7)
函数的所有定义必须具有相同的 arity ,即相同数量的函数参数。您可以用三行来定义delta
:
delta
的定义,其中arity为零(=
左侧没有参数)delta
的另一个定义,其中arity为2(=
左侧有两个参数)这两个定义具有不同的arity,因此编译器会告诉您存在冲突的定义。
问问自己:delta
的行为是什么?编译器将按照定义它们的顺序查看delta
的定义,并选择模式匹配成功的第一个定义。由于第一个定义中没有参数(因此没有匹配的模式),因此它将始终成功,永远不会调用第二个定义。