Haskell基本"检查"函数

时间:2018-01-27 04:35:51

标签: regex haskell

我有这个家庭作业问题,我绝对迷失了......所以问题是"填写Sing和(:。:)案例的定义" check" 。函数#&34;我很困惑Regex和Maybe String的含义。也不太清楚很多语法是什么,每次我查看视频时我都不理解它。我已经使用c ++和c编程了一段时间并且理解它很好,如果可能的话那些例子会很好。关于如何测试该功能的说明会很棒。我知道如何编译并在GHCI中运行它,但我不知道输入什么来触发该功能的测试。

代码看起来像这样

check :: Regex -> String -> Maybe String
check Epsilon cs = Just cs
check (Sing c) (c':cs) = c' + cs
check (r1 :.: r2) cs = r1 + r2
check (r1 :|: r2) cs =
    case check r1 cs of
        Just cs' -> Just cs'
        Nothing  -> check r2 cs
check (Plus r) cs =
    case check r cs of
        Just cs' -> case check (Plus r) cs' of
            Just cs'' -> Just cs''
            Nothing   -> Just cs'
        Nothing -> Nothing
check _ _ = Nothing

所以第3行的c' +cs是我的尝试,并且说明下一行非常相似,但我尝试r1 + r2这个,它甚至不编译。

data Regex
  = Epsilon           -- empty string
  | Sing Char         -- single character
  | (:.:) Regex Regex -- concatenation
  | (:|:) Regex Regex -- alternation
  | Plus Regex        -- repetition (one or more)

2 个答案:

答案 0 :(得分:3)

不是一个完整的答案,因为这是家庭作业(也不是MCVE),但我建议的这类问题的一般方法是用“' s称为打字孔。也就是说,将带有error语句的行更改为以下内容:

check (Sing c) (c':cs) = _
check (r1 --- r2) cs = _
然后GHC会给你一个编译错误,告诉你这个洞的类型是什么,以及哪些变量在范围内,并用正确的类型来填充它。您可以抑制此错误以编译和测试其余代码,并且只有在error具有-fdefer-typed-holes命令行选项的情况下实际执行该漏洞时才会使程序崩溃。

如果你部分确定解决方案,你可以部分填补这个漏洞。让我们说你的洞是一个函数,从一个类型的列表到另一个类型的列表。然后,您可以尝试map _。如果您正在接收列表(c':cs)并返回列表,则表单可能包含(_ c'):(check _ cs)形式。如果您需要返回Maybe内容,可以尝试Just _。使用正确类型的功能继续填充孔,直到您有一个工作程序。

Regex是某种类型(可能代表正则表达式),它应该在您给出的图书馆中定义,以及您可以使用的函数他们。 check函数应该有两个参数,RegexString。 (据推测,它正在检查String是否与Regex匹配?)A Maybe String是一种包含JustString或{的类型{1}},所以在这种情况下,我猜测你应该返回匹配的字符串的一部分,或者如果没有匹配则返回Nothing。但是作业应该给你一个规范。

答案 1 :(得分:1)

  

如何测试该功能的说明会很棒。

你没有说明这个功能的目的,所以我会做出有根据的猜测。

函数check re str采用正则表达式re和字符串str,并检查str前缀是否与{{1}匹配}}。成功时会返回re,其中Just str2是匹配前缀后str2 rest 。如果失败,则返回str

(顺便说一句,我不认为这个界面允许在替代案例中实现正确的回溯,但我会忽略它。)

一些测试用例:

Nothing将字符串“abc”与正则表达式“ab”匹配:结果应为check (Sing 'a' :.: Sing 'b') "abc"

Just "c"应为check (Sing 'a' :.: Sing 'b') "axbc"

Nothing应为check (Plus (Sing 'a') :.: Sing 'b') "aaaaaabc"

Just "c"应为check ((Sing 'a' :|: Sing 'A') :.: Sing 'b') "abc"

Just "c"也应为check ((Sing 'a' :|: Sing 'A') :.: Sing 'b') "Abc"