【问题标题】:Expand a function in Haskell在 Haskell 中展开函数
【发布时间】: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


【解决方案1】:

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

  1. 第一行是类型签名。
  2. 第二行是delta定义,元数为零(= 左侧没有参数)
  3. 第三行是delta 的另一个定义,有两个元数(= 左侧的两个参数)

这两个定义有不同的数量,所以编译器会告诉你有冲突的定义。

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

【讨论】:

  • 谢谢,这让它点击了。在特定案例之后让它工作delta x y = deltaTest re (start + 1) x y
  • @lombardo2 很好,解决了 arity 问题,但第一个定义现在完全通用,第二个定义仍然不会被调用! (编译时您应该会收到关于 Pattern match is redundant 的警告。)这不会达到您的预期。
  • 是的,刚刚注意到。我强硬startstart 在哪里之前是一样的,一个常数,但我猜它不是。在命令式思考了这么多之后,很难掌握函数式编程
  • 在这种情况下它与命令无关。你只需要习惯范围规则。模式中出现的标识符始终是“新的”标识符,并且会影响在其范围内具有相同名称的任何其他标识符。现在,接下来要学习的是感受模式出现的地方。 :)
  • 你可以使用守卫,即delta x y | x == start, y == epsilon = .....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2012-06-13
  • 2011-05-24
  • 2018-02-11
  • 2011-10-16
  • 2011-09-12
相关资源
最近更新 更多