首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对具有多个变量的函数使用绑定(>>=)

如何对具有多个变量的函数使用绑定(>>=)
EN

Stack Overflow用户
提问于 2012-08-05 07:19:58
回答 2查看 940关注 0票数 3

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

我在这里有这个函数main:

代码语言:javascript
复制
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中,这就是我想在值上使用函数时的困难之处。

在这里,我使用绑定函数将输入应用到rnd_select函数:

代码语言:javascript
复制
(`rnd_select` 6) =<< readNumbers

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-05 08:01:09

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

代码语言:javascript
复制
foobar = baz . foo 5 17 29 . bar

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

代码语言:javascript
复制
foobar = baz . (\x -> foo 5 17 x 29 41) . bar

但是对于只有两个参数的情况,flip是一个很好的替代方案,

代码语言:javascript
复制
main = print =<< flip rnd_select 6 =<< readNumbers
票数 4
EN

Stack Overflow用户

发布于 2012-08-05 08:02:24

或者交换rnd_select参数,或者使用flip rnd_select 6 =<< readNumbers

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11812722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档