Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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 - Fatal编程技术网

模式匹配不同的输入相同的输出haskell

模式匹配不同的输入相同的输出haskell,haskell,Haskell,我有一个功能,输出一个月内的天数,需要更换防护装置并使用模式匹配。 ` ` 我是否可以将4、6、9和11个月放在同一行上,以及如何将它们放在不同的行上?您可以使用ViewPatterns扩展来匹配应用于参数的任意函数的结果。这可能不符合切换到模式匹配的精神,但我认为它满足了任务的要求 {-# LANGUAGE ViewPatterns #-} daysInMonth :: Int -> Int daysInMonth (\x -> x < 0 || x > 12 -&g

我有一个功能,输出一个月内的天数,需要更换防护装置并使用模式匹配。 `

` 我是否可以将4、6、9和11个月放在同一行上,以及如何将它们放在不同的行上?

您可以使用ViewPatterns扩展来匹配应用于参数的任意函数的结果。这可能不符合切换到模式匹配的精神,但我认为它满足了任务的要求

{-# LANGUAGE ViewPatterns #-}

daysInMonth :: Int -> Int
daysInMonth (\x -> x < 0 || x > 12 -> True) = error "Month does not exist"
daysInMonth ((`elem` [4, 6, 9, 11]) -> True) = 30
daysInMonth 2 = 28
daysInMonth _ = 31
在这里,我们应用查找来获取一个可能的Int值,并将其与d匹配。如果有效的月份号的查找成功,我们将返回值d。如果lookup没有返回任何结果,那么模式匹配将失败,我们将尝试下一个模式匹配,它将为所看到的任何输入调用error


当然,这更简单地写为daysInMonth=可能是错误。。。身份证件翻转查找[…]而不是求助于ViewPatterns扩展,但我认为这是视图模式工作原理的一个很好的示例。

我不确定是否理解这个问题,让我试试

如果您真的需要移除防护,您可以为每个案例匹配输入值。但正如您所见,它将大大降低可读性

使用模式匹配时要小心,确保包括所有可能的情况

下面的代码不是一个好的例子,只是为了说明它是可以做到的

daysInMonth :: Int -> Int

-- | m == 4 || m == 6 || m == 9 || m == 11 = 30
daysInMonth 4 = 30
daysInMonth 6 = 30
daysInMonth 9 = 30
daysInMonth 11 = 30

-- | m == 2 = 28
daysInMonth 2 = 28

-- | m > 12 || m < 0 = error "Month does not exist"
-- | m == m = 31
daysInMonth m = if (m > 12 || m < 0)
                then error "Month does not exist"
                else 31

我不确定问题是什么。你所拥有的一切都很好,虽然你可以简化第一个保护,使之只包含m元素[4,6,9,11],元素需要包含在反勾中,但我不知道如何在这里做到这一点,而不会弄乱格式。如果要使用模式匹配而不是保护,则需要在单独的行上执行类似M4=30、M6=30等操作。在处理完特殊情况后,你可以用m_u=31结束,这样就不用再做12个单独的情况。当你说需要时,这是不是因为你有一个关于使用模式匹配的家庭作业?我想不出一个离开警卫的好理由。@RobinZigmond将这样的代码用双回环括起来。
daysInMonth :: Int -> Int
daysInMonth (flip lookup [(1,31), (2,28), (3,31), ...] -> Just d) = d
daysInMonth _ = error "Month does not exist"
daysInMonth :: Int -> Int

-- | m == 4 || m == 6 || m == 9 || m == 11 = 30
daysInMonth 4 = 30
daysInMonth 6 = 30
daysInMonth 9 = 30
daysInMonth 11 = 30

-- | m == 2 = 28
daysInMonth 2 = 28

-- | m > 12 || m < 0 = error "Month does not exist"
-- | m == m = 31
daysInMonth m = if (m > 12 || m < 0)
                then error "Month does not exist"
                else 31