Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中的嵌套模式匹配_Haskell_Pattern Matching - Fatal编程技术网

Haskell中的嵌套模式匹配

Haskell中的嵌套模式匹配,haskell,pattern-matching,Haskell,Pattern Matching,我有以下数据结构来模拟Haskell中的替代版本编号方法: data VersionNumber = VC (Maybe Int) -- VersionCompound: x (Nothing), 1 (Just 1), 2 (Just 2), 3 (Just 3), 4, 5, ... | VN VersionNumber (Maybe Int) -- VersionNumber: x.x, x.0, x.1, x.2, ... , 1.0, 1.1, 1.2, ... 1.x

我有以下数据结构来模拟Haskell中的替代版本编号方法:

data VersionNumber = VC (Maybe Int) -- VersionCompound: x (Nothing), 1 (Just 1), 2 (Just 2), 3 (Just 3), 4, 5, ...
        | VN VersionNumber (Maybe Int) -- VersionNumber: x.x, x.0, x.1, x.2, ... , 1.0, 1.1, 1.2, ... 1.x.x, 2.x.x, 3.x.x, ...
        deriving (Show)

versionCompoundToString :: (Maybe Int)-> String
versionCompoundToString (Just n) = (show n)
versionCompoundToString Nothing = "x"

versionNumberToString :: VersionNumber -> String
versionNumberToString (VN vn vc) = (versionNumberToString vn) ++ "." ++ (versionCompoundToString vc)
versionNumberToString (VC vc) = (versionCompoundToString vc)
根据上述定义,以下构造是合法的:

*VersionNumber> versionNumberToString (VN (VN (VC (Just 1)) Nothing) Nothing)
"1.x.x"

*VersionNumber> versionNumberToString (VN (VC (Just 2)) Nothing)
"2.x"

*VersionNumber> versionNumberToString (VN (VN (VN (VC Nothing) Nothing) (Just 3)) Nothing)
"x.x.3.x"
我正在尝试编写能够检测不同版本编号模式的函数。例如,对于
1.x
x.2.x
x.x.3.x
x.x.x.5.x
等版本号,下面的函数
isReleaseBranch
应该返回
True
。同样,下面的值应该返回相应的结果:
x.x.4.x
True
x.x
->
False
1.2.x
->
False
。到目前为止,我能想到的只是以下模式匹配实现:

isReleaseBranch (VN (VC (Just _)) Nothing) = True
isReleaseBranch _ = False

我不知道如何匹配版本号左侧任意x的嵌套模式:
VN(VC Nothing)Nothing
x.x
)of
(VN(VN(VC Nothing)Nothing)(仅3))Nothing
x.x.3.x
)或
VN(VN(VC Nothing)Nothing)Nothing
x.x.x
)的,等等。有没有办法在Haskell中实现这种嵌套模式匹配?

我不能完全理解,但是如果你想处理任意嵌套,你必须使用递归。你的类型本质上是一个非空的
列表,可能是Int
,所以你可以像类型一样在列表上递归。我知道我需要使用递归。但我必须这样做我在这个问题上思考了很多,但无法完全理解如何实现递归(如果可以实现的话)1)
x.x.4.x
,2)
x.x
,3)
1.2.x
?我不知道一般的规则是什么。(也许您应该在问题本身中添加预期结果)您实际上是在尝试解析字符串,并确定它们是否在您的定义中。我不认为模式匹配语言会对你有什么神奇的作用,你只需要编写解析程序。你知道你的类型本质上是
[Maybe Int]
(嗯,
非空(Maybe Int)
)?这应该会给你一些想法。我不能完全理解,但如果你想处理任意嵌套,你必须使用递归。您的类型本质上是一个非空的
列表,可能是Int
,因此可以像类型一样在列表上递归。我知道我需要使用递归。但我一直在思考这个问题,甚至不能完全理解如何使用递归实现它(如果可以实现的话),1)
x.x.4.x
,2)
x.x
,3)
1.2.x
?我不知道一般的规则是什么。(也许您应该在问题本身中添加预期结果)您实际上是在尝试解析字符串,并确定它们是否在您的定义中。我不认为模式匹配语言会对你有什么神奇的作用,你只需要编写解析程序。你知道你的类型本质上是
[Maybe Int]
(嗯,
非空(Maybe Int)
)?这会给你一些想法。