将函数的输出作为Haskell中另一个函数的输入传递

Mem*_*emo 3 haskell input output

如何将函数的输出作为另一个函数的输入传递.

例如,我有这两个功能

collatz :: (Integral a) => a -> [a]
collatz 1 = [1]  
collatz n  
    |even n = n:collatz (n `div` 2)  
    |odd n = n:collatz (n*3 + 1) 
Run Code Online (Sandbox Code Playgroud)

而我的另一个功能

length' [] = 0
length' (x:xs) = 1 + length' xs
Run Code Online (Sandbox Code Playgroud)

我想计算列表的长度,这是从我的collat​​z函数输出的.

最后我想完全计算这个

numLongChains :: Int  
numLongChains = length (filter isLong (map collatz [1..100]))  
    where isLong xs = length xs > 15  
Run Code Online (Sandbox Code Playgroud)

但一步一步.

Gre*_*Veg 5

你在谈论功能组成:

-- assuming signature length' :: [a] -> Int   
composed :: (Integral a) => a -> Int
composed = length' . collatz
Run Code Online (Sandbox Code Playgroud)

我不确定你是什么意思'一步一步',但对于你的第二个问题,它将是:

numLongChains :: (Integral a) => [a] -> Int
numLongChains = length' . (filter isLong) . (map collatz)
    where isLong xs = length' xs > 15 
Run Code Online (Sandbox Code Playgroud)

我使它成为一个一元函数,因此它可以用于任何列表,而不仅仅是[1..100].

  • 仅供参考,这里的括号是可选的,删除它们使得线条更容易阅读imo. (2认同)