gpt4 book ai didi

list - Do-notation 和列表单子(monad)

转载 作者:行者123 更新时间:2023-12-04 18:11:02 30 4
gpt4 key购买 nike

我正在学习 Haskell。
我正在尝试查找列表中的元素 as列表元素的总和 bs ,将元素作为元组返回:

findSum2 :: [Int] -> [Int] -> [(Int,Int,Int)]
findSum2 as bs = [(a, a', b) | a <- as, a' <- as, b <- bs, a + a' == b]
该代码有效。但是为了学习 Haskell,我试图将其重写为 do -符号:
findSum2 :: [Int] -> [Int] -> [(Int,Int,Int)]
findSum2 as bs = do
a <- as
a' <- as
b <- bs
if a + a' == b then return (a, a', b)
else return ()
然后类型检查器向我提示:
   • Couldn't match type ‘()’ with ‘(Int, Int, Int)’
Expected type: [(Int, Int, Int)]
Actual type: [()]
平心而论,我知道会的。但是因为我不能跳过 else Haskell 中的子句,我应该在 return 中添加什么 else 中的声明条款?
谢谢。

最佳答案

您必须在 else 中返回正确类型的内容。条款。可能是空列表 [] , 或抽象值之一,如 mzeroempty .
或者您可以删除 if表达式并使用 guard 功能。

import Control.Monad (guard)

findSum2 :: [Int] -> [Int] -> [(Int,Int,Int)]
findSum2 as bs = do
a <- as
a' <- as
b <- bs
guard (a + a' == b)
return (a, a', b)
通过这个实现,您现在还可以将您的函数签名概括为:
findSum2 :: MonadPlus m => m Int -> m Int -> m (Int, Int, Int)

关于list - Do-notation 和列表单子(monad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69988537/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com