函数结果上的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