我知道采用列表输入的方法可以使用模式匹配,如下所示:
testingMethod [] = "Blank"
testingMethod (x:xs) = show x
我的问题是,我可以使用if功能吗?例如,如果我有一个需要检查function2输出模式的function1,我该怎么做呢?我正在寻找这样的东西:
if (function2 inputInt == pattern((x:xs), [1,2,3])) then
这可以在哈斯克尔做吗?
答案 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
或使用case
和let
(或者您可以内联或使用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
返回两个列表的元组。