haskell 将部分模式匹配 Package 成Maybe

vbopmzt1  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(171)

有没有办法将部分模式匹配 Package 成Maybe?
我想写一些类似这样的代码:

fromMaybe defaultValue $ do
  [a, b] <- mkList :: [Int]
  [x] <- mkList' a b :: [Int]
  return $ x

其中,如果mkList的计算结果为长度/= 2的列表,或者mkList' a b的计算结果为长度/= 1的列表,则此表达式的值为defaultValue。否则,表达式的计算结果为mkList' a b返回的唯一元素。
我认为Maybe单子可以很好地实现这一点,但是如何将失败的模式匹配转换为Nothing,并将成功的匹配转换为Just呢?
在 haskell 有可能做到这一点吗?

m4pnthwp

m4pnthwp1#

你的代码几乎可以正常工作,你只需要添加一些pure并改变类型:

import Data.Maybe

f defaultValue mkList mkList' = fromMaybe defaultValue $ do
  [a, b] <- pure mkList :: Maybe [Int]
  [x] <- pure (mkList' a b) :: Maybe [Int]
  return x

您甚至不需要那些:: Maybe [Int]注解。
在GHCi中,您可以看到它具有预期的行为:

ghci> f 0 [1,2,3] (\x y -> [x,y])
0
ghci> f 0 [1,2] (\x y -> [x])
1
ghci> f 0 [1,2] (\x y -> [y])
2
ghci> f 0 [1,2] (\x y -> [x,y])
0

相关问题