我有这个代码,它生成从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
答案 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:_
。