gpt4 book ai didi

haskell - 如何在具有多个变量的函数上使用绑定(bind) (>>=)

转载 作者:行者123 更新时间:2023-12-02 17:00:18 27 4
gpt4 key购买 nike

我是 Haskell 和函数式编程的新手。这可能是一件很简单的事情,但我在搜索时没有找到答案。

我这里有这个函数 main:

main :: IO ()
main = print =<< (`rnd_select` 6) =<< readNumbers

readNumbers :: IO [(Int,Int,Int)]
readNumbers = makeTriples . map rInt . words <$> readFile "somefile"

rInt :: String -> Int
rInt = read

makeTriples :: [a] -> [(a,a,a)]
makeTriples [] = []
makeTriples (x:y:z:zs) = (x,y,z) : makeTriples zs

rnd_select :: [a] -> Int -> IO [a]
rnd_select _ 0 = return []
rnd_select [] _ = return []
rnd_select xs count = do r <- randomRIO (0, (length xs)-1)
rest <- rnd_select (removeAt (r+1) xs) (count-1)
return ((xs!!r) : rest)

removeAt :: Int -> [a] -> [a]
removeAt _ [] = []
removeAt 1 (x:xs) = xs
removeAt k (x:xs) = let r = removeAt (k - 1) xs in x:r

它包含在 IO-monad 中,这就是当我想在值上使用函数时变得困难的原因。

这里我使用bind函数将输入应用到rnd_select函数:

(`rnd_select` 6) =<< readNumbers

但为了做到这一点,我必须将其部分应用到一个值。

我认为它看起来不太好,而且我不知道如果函数有更多变量我会怎么做。

所以我想知道是否有更好的方法将值应用于此类函数?

最佳答案

除了定义函数以使省略的参数是最后一个参数之外,以便您可以编写

foobar = baz . foo 5 17 29 . bar

您可以使用 lambda 省略最后一个参数以外的参数,

foobar = baz . (\x -> foo 5 17 x 29 41) . bar

但对于只有两个参数的情况,flip 是一个不错的选择,

main = print =<< flip rnd_select 6 =<< readNumbers

关于haskell - 如何在具有多个变量的函数上使用绑定(bind) (>>=),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11812722/

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