[Haskell-cafe] Function Returning Type?

Thomas Davie tom.davie at gmail.com
Thu May 21 16:15:08 EDT 2009


Op 21 May 2009, om 21:52 heeft Stefan Holdermans het volgende  
geschreven:

> Jochem,
>
>>>> rationals n = (putStr . unlines . map show) (take n (nub [x % y |  
>>>> y <-
>>>> [1..], x <- [1..y], x < y]))
>
>>> rationals n :: Integer -> [Ratio]
>
>> I meant "Integer -> String" obviously.
>
> Er... what about
>
>  rationals :: Int -> IO ()

Of note here though, the original type Integer -> String is more  
desirable – the Int/Integer part doesn't matter so much, what matters  
is the IO type – we can no longer pass the value that rationals  
generates into another function, because it printed it and dumped it.

Lets fix the function instead:

rationals :: Int -> [Rational]
rationals n = take n $ nub [x % y | y <- [1..], x <- 1..], x < y]

showLines :: Show a => [a] -> String
showLines = unlines . map show

rationalsS :: Int -> String
rationalsS = showLines . rationals

Now we can chose to use the actual rationals we got out of the  
function, we can chose to use the string we get back, we can reuse our  
function for showing multiple showable values, and we can print any of  
these if we chose :).

Bob


More information about the Haskell-Cafe mailing list