函数结果上的Haskell模式匹配
我有一个代数数据类型,如:函数结果上的Haskell模式匹配,haskell,Haskell,我有一个代数数据类型,如: data Toll = Vok Int Bool | Bok Int | Cokd String Char 还有一个功能 getVal :: Int -> Toll getVal 1 = Cokd "hello" 'c' getVal _ = Bok 12 我想在某个函数中调用getVal,并提取Cokd的参数(如果答案是类型Cokd)(可能使用模式匹配) 我可以这样做吗 hello :: Int -> Bool hello x = if st ==
data Toll = Vok Int Bool | Bok Int | Cokd String Char
还有一个功能
getVal :: Int -> Toll
getVal 1 = Cokd "hello" 'c'
getVal _ = Bok 12
我想在某个函数中调用getVal
,并提取Cokd
的参数(如果答案是类型Cokd
)(可能使用模式匹配)
我可以这样做吗
hello :: Int -> Bool
hello x = if st == "hell" then True else False
where (Cokd st ch) = getVal x
我不能用单子
如何做到这一点?您可以使用
case
模式匹配getVal
的结果:
data Toll = Vok Int Bool | Bok Int | Cokd String Char
getVal :: Int -> Toll
getVal 1 = Cokd "hello" 'c'
getVal _ = Bok 12
hello :: Int -> Bool
hello x =
case getVal x of
Cokd st ch ->
st == "hell"
_ -> False
或者创建一个单独的函数并与参数匹配:
hello :: Int -> Bool
hello =
helloToll . getVal
where
helloToll (Cokd st ch) = st == "hell"
helloToll _ = False
您在问题中提供的示例经过编译(很少修改),但当您尝试使用
2
调用hello
(或与1
不同的任何其他值)时,它将引发运行时异常,在这种情况下getValue
返回bok12
,因此(Cokd st ch)=getVal x
模式匹配失败)。您的代码似乎完全正确,只需一个更正:模式if-then True-else-False
可以替换为
但是,由于非穷举模式匹配,对于1
以外的值,此代码将失败。您需要涵盖所有情况:
hello :: Int -> Bool
hello x = case getVal x of
Cokd st ch -> st == "hell"
_ -> False
是否要与
getVal
的结果进行模式匹配?类似于{Cokd str ch->…}的case getVal x的东西
?我能像在@zhekakozlov上面的编辑帖子一样吗?我在原始帖子中显示的方式似乎是编译的,它会工作吗@igor只要您向hello
提供1
,它就可以工作。其他值将失败。(更新我的答案)
hello :: Int -> Bool
hello x = case getVal x of
Cokd st ch -> st == "hell"
_ -> False