gpt4 book ai didi

haskell - 在 do block 中将两个函数的返回值分配给两个变量

转载 作者:行者123 更新时间:2023-12-02 20:55:04 25 4
gpt4 key购买 nike

抱歉标题太血腥(如果您能提出更好的建议,请这样做)。但我的问题是我不太明白如何让这个 do block 工作。我有一个代码返回列表列表中 5 的位置。像这样:

findFive :: [[Int]] -> (Int, Int)
findFive rs = do
x <- xPos rs 0
y <- yPos rs 0
return ( (x,y) )

xPos :: [[Int]] -> Int -> Int
xPos (rs:[[]]) n = n
xPos (rs:rss) n | elem 5 rs = n
| otherwise = xPos rss (n+1)

yPos :: [[Int]] -> Int -> Int
yPos (rs:[[]]) n = n
yPos (rs:rss) n | elem 5 rs = n
| otherwise = yPos rss (n+1)

但我不能这样使用我的 do block 。我可以通过这样做让它工作

findFive :: [[Int]] -> (Int, Int)
findFive xs = ( (xPos xs 0), (yPos (transpose (xs)) 0) )

但是看起来有点丑。

此外,有没有一种方法可以使其工作而无需将 0 发送到 xPosyPos

最佳答案

为什么这样做?那里没有单子(monad)。 let..in 就足够了:

findFive :: [[Int]] -> (Int, Int)
findFive rs = let
x = xPos rs 0
y = yPos rs 0
in (x,y)

或者,使用where:

findFive :: [[Int]] -> (Int, Int)
findFive rs = (x, y)
where
x = xPos rs 0
y = yPos rs 0

关于haskell - 在 do block 中将两个函数的返回值分配给两个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39690217/

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