是否可以在Haskell中使用if函数使用模式匹配?

时间:2017-11-16 20:20:49

标签: haskell functional-programming matching

我知道采用列表输入的方法可以使用模式匹配,如下所示:

testingMethod [] = "Blank"
testingMethod (x:xs) = show x

我的问题是,我可以使用if功能吗?例如,如果我有一个需要检查function2输出模式的function1,我该怎么做呢?我正在寻找这样的东西:

if (function2 inputInt == pattern((x:xs), [1,2,3])) then

这可以在哈斯克尔做吗?

2 个答案:

答案 0 :(得分:6)

您正在寻找的语法是案例陈述或警卫:

你说:

if (function2 inputInt == pattern((x:xs), [1,2,3])) then

在Haskell:

testingMethod inputInt | (x:xs, [1,2,3]) <- function2 inputInt = expr
                       | otherwise = expr2

或使用caselet(或者您可以内联或使用where):

testingMethod inputInt =
    let res = function2 inputInt
    in case res of
         (x:xs, [1,2,3]) -> expr
         _ -> expr2

或使用视图模式:

{-# LANGUAGE ViewPatterns #-}
testingMethod (function2 -> (x:xs,[1,2,3])) = expr
testingMethod _ = expr2

答案 1 :(得分:1)

函数定义中的模式匹配只是case提供的“基本”模式匹配的语法糖。例如,让我们去看你的第一个函数:

testingMethod [] = "Blank"
testingMethod (x:xs) = show x

可以改写为:

testingMethod arg = case arg of
  [] -> "Blank"
  (x:xs) -> show x

你打算用你的第二个片段做什么并不是很清楚,所以我无法真正向你展示case表达式的外观。但是一种可能的解释是这样的:

case function2 inputInt of
  ((x:xs), [1,2,3]) -> -- ...
  (_, _) -> -- ...

这假设您的function2返回两个列表的元组。