我有这个家庭作业问题,我绝对迷失了......所以问题是"填写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)
答案 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
函数应该有两个参数,Regex
和String
。 (据推测,它正在检查String
是否与Regex
匹配?)A Maybe String
是一种包含Just
和String
或{的类型{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"
。