3

I'm currently trying to find the definition of the words function to help get an idea for a similar function I'm writing. So I was wondering is there somewhere that has all the definitions of the Prelude functions? Maybe a GHCi command to show the definition of one, or something on the Haskell wiki, I'm not sure.

Or if there isn't somewhere I can find that do any of y'all know what the definitions of words is?

Micha Wiedenmann
  • 19,979
  • 21
  • 92
  • 137
AmberYall
  • 31
  • 3
  • 9
    [Hoogle for it](https://hoogle.haskell.org/?hoogle=words&scope=set%3Astackage), [jump to the one you want](https://hackage.haskell.org/package/base-4.16.3.0/docs/Prelude.html#v:words), [click on the `Source` link](https://hackage.haskell.org/package/base-4.16.3.0/docs/src/Data.OldList.html#words) – Bergi Jul 30 '22 at 00:25
  • ty Bergi, the Source link was what I needed. – AmberYall Jul 30 '22 at 00:31
  • @MichaWiedenmann I thought there might be a better answer than "check online", especially since OP asked about GHCI. – Bergi Jul 30 '22 at 19:31

2 Answers2

1

Most packages on Hackage come with documentation that also includes a link to the source code for every function. You can usually find the function via Hoogle.

In the case of words, the Prelude documentation is found here, and the source is found at https://hackage.haskell.org/package/base-4.16.3.0/docs/src/Data.OldList.html#words:

-- | 'words' breaks a string up into a list of words, which were delimited
-- by white space.
--
-- >>> words "Lorem ipsum\ndolor"
-- ["Lorem","ipsum","dolor"]
words                   :: String -> [String]
{-# NOINLINE [1] words #-}
words s                 =  case dropWhile {-partain:Char.-}isSpace s of
                                "" -> []
                                s' -> w : words s''
                                      where (w, s'') =
                                             break {-partain:Char.-}isSpace s'

This should in general also work with local documentation.

For ghci specifically, there are :info and :list commands, but :list words only produces an error message ("cannot list source code for words: module base-…:Data.OldList is not interpreted") for me.

Bergi
  • 630,263
  • 148
  • 957
  • 1,375
1

Documentation of a function.

To search for the definition, look at hackage. In the case of words: https://hackage.haskell.org/package/base-4.16.3.0/docs/Prelude.html#v:words

Finding a function

To find a function, use hoogle. It is the de-facto tool for finding a function.

Example:

This is inside the shell. Hoogle can be installed at the samne time as when ghc is. Find a function like so:

> hoogle "subtract"
Prelude subtract :: Num a => a -> a -> a
GHC.Num subtract :: Num a => a -> a -> a
Distribution.Compat.Prelude.Internal subtract :: Num a => a -> a -> a
GHC.Prelude subtract :: Num a => a -> a -> a
Hedgehog.Internal.Prelude subtract :: Num a => a -> a -> a
BasePrelude subtract :: Num a => a -> a -> a
RIO.Prelude subtract :: Num a => a -> a -> a
System.Metrics.Gauge subtract :: Gauge -> Int64 -> IO ()
ClassyPrelude subtract :: Num a => a -> a -> a
Algebra.Additive subtract :: C a => a -> a -> a
-- plus more results not shown, pass --count=20 to see more

The cool thing is, you can also search for types and functions with certain types. For example, here is the list of functions which will take an Int and return an Int.

hoogle "Int -> Int"
GHC.Unicode wgencat :: Int -> Int
System.Win32.DebugApi dr :: Int -> Int
Codec.Picture.Jpg.Internal.Common toBlockSize :: Int -> Int
Statistics.Function nextHighestPowerOfTwo :: Int -> Int
Numeric.SpecFunctions log2 :: Int -> Int
Math.NumberTheory.Logarithms intLog2 :: Int -> Int
Math.NumberTheory.Logarithms intLog2' :: Int -> Int
Streamly.Internal.Data.Array.Foreign.Mut.Type roundUpToPower2 :: Int -> Int
Streamly.Internal.System.IO arrayPayloadSize :: Int -> Int
Data.Array.Comfort.Shape triangleSize :: Int -> Int
-- plus more results not shown, pass --count=20 to see more

Naitik Mundra
  • 418
  • 3
  • 14