在Haskell中展开函数

时间:2016-10-05 16:54:33

标签: function haskell recursion

在我的作业中,我们得到了正则表达式。我必须退回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添加更多定义,但它不起作用。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:7)

函数的所有定义必须具有相同的 arity ,即相同数量的函数参数。您可以用三行来定义delta

  1. 第一行是类型签名。
  2. 第二行是delta定义,其中arity为零(=左侧没有参数)
  3. 第三行是delta的另一个定义,其中arity为2(=左侧有两个参数)
  4. 这两个定义具有不同的arity,因此编译器会告诉您存在冲突的定义。

    问问自己:delta的行为是什么?编译器将按照定义它们的顺序查看delta的定义,并选择模式匹配成功的第一个定义。由于第一个定义中没有参数(因此没有匹配的模式),因此它将始终成功,永远不会调用第二个定义。