【问题标题】:func :: Maybe(Int) -> Maybe(Int)函数 :: Maybe(Int) -> Maybe(Int)
【发布时间】:2019-11-12 22:36:33
【问题描述】:

我做了一些研究,但找不到任何东西。我不明白这样的功能是如何工作的:

func :: Maybe (Int) -> Maybe (Int)

我应该如何进行模式匹配?我试过了,但没有用:

func Just a  = Just a | otherwise = Nothing
func Nothing = Just Nothing | otherwise = Nothing

我怎样才能做到这一点?

错误信息:

exercises6.hs:83:22: error: parse error on input ‘|’
   |
83 | func Just a = Just a | otherwise = Nothing
   |                      ^

【问题讨论】:

  • 这里有很多错误(别担心,我们都会犯,尤其是第一次学习时)。我很好奇你想用| otherwise = Nothing 在这里实现什么。
  • 第二。我对守卫犯了这个确切的错误。你会明白的。

标签: haskell functional-programming maybe


【解决方案1】:

您在两种可能的情况下进行模式匹配。 Maybe a 有两个数据构造函数:Nothing 和带有 包装值的 Just …。进行模式匹配时没有| otherwise 部分。管道字符 (|) 用于guards [lyah]

因此,您可以例如增加 Just 中的值:

func :: Maybe Int -> Maybe Int
func (Just x) = Just (x+1)
func Nothing = Nothing

Just x 周围的括号在这里是必需的,如 @chepner says。否则会被解析为Just是第一个参数,x是第二个参数。

由于MaybeFunctor typeclass 的一个实例,您可以在这里使用fmap :: Functor f => (a -> b) -> f a -> f b

func :: Maybe Int -> Maybe Int
func = fmap (1+)

【讨论】:

  • 另外,请注意(Just x) 周围的括号是必需的;否则,func Just x = ... 将被解释为匹配文字参数 Just 和一个无可辩驳的模式 x 匹配任何第二个参数。
  • 可能有用的是说方程之间的分隔符是分号;,而不是|func (Just x) = Just (x + 1); func Nothing = Nothing。将方程放在单独的行上会通过布局插入一个虚拟分号。 | 用于守卫
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
相关资源
最近更新 更多