将列表传递给另一个函数

时间:2016-01-19 15:56:37

标签: haskell

我有这个代码,它生成从2到 n

的素数
primes :: Integer -> [Integer]
primes n = sieve [2..n]
where
 sieve (p:xs) = p : sieve [x|x <- xs, x `mod` p > 0]

如何将sieve d列表(有我的素数)传递给另一个函数?

这样的东西不起作用(解析错误)

someText:: [Integer] -> String
someText (x:[]) = "List starts  with" ++ show x

primes :: Integer -> [Integer]
primes n = sieve [2..n]
where
 sieve (p:xs) = p : sieve [x|x <- xs, x `mod` p > 0]
 someText sieve

1 个答案:

答案 0 :(得分:3)

你没有传递某些东西到某个功能,就像某个列表一样。这是必要的思考。你在Haskell做的是,你评估一些函数,例如:列表作为其参数。通常情况下,您只需保留primes,并将结果用作someText的参数。像

main :: IO ()
main = print (someText $ primes 100)

或仅仅在REPL中

GHCi> someText $ primes 100
"List starts  with2"

当然,您也可以重新定义primes以包含someText。但显然,结果将是一个字符串,而不再是一个列表!

primes' :: Integer -> String
primes' n = someText $ sieve [2..n]
 where sieve (p:xs) = p : sieve [x|x <- xs, x `mod` p > 0]

最好不要这样做,因为当你想以任何其他方式使用素数列表时,这样的字符串是没用的。您可以更好地调用原始的primes函数:

primes' :: Integer -> String
primes' = someText . primes

实际上这不起作用:您的函数someText不完整。模式x:[] 匹配一个只有一个元素的列表(这更容易编写someText [x] = ...)。您希望匹配任何以一个元素开头的列表;使用模式x:_

执行此操作