Suppose your module has 100 functions,
and you want to expose only 10 out of 100 functions.
How
can you do this?
Following statement expose only
function1, function2 to outside world.
module MyModule (function1, function2)
where
Above statement expose only function1,
function2 of the module MyModule.
Example
NumberUtil.hs
module NumberUtil (dropLastDigit, getLastDigit) where {- Drop last digit -} dropLastDigit :: Integer -> Integer dropLastDigit num | (num < 0) = (-1) * (dropLastDigit ((-1) * num)) | otherwise = processNum (num `div` 10) 0 {- Return the last digit of a number -} getLastDigit :: Integer -> Integer getLastDigit num | (num < 0) = ((-1) * num) `rem` 10 | otherwise = num `rem` 10 processNum num temp | (num==0) = 0 | otherwise = ((getLastDigit num) * (10 ^ temp)) + processNum (num `div` 10) (temp+1)
test.hs
import NumberUtil removeLastDigit num = dropLastDigit num getMeLastDigit num = getLastDigit num processData num temp = processNum num temp
'test.hs' is using processNum function
of Module NumberUtil, which is not exposed to outside world. So when you try to
load test.hs, you will get error like ‘Not in scope: ‘processNum’’.
Prelude> :load test.hs [1 of 2] Compiling NumberUtil ( NumberUtil.hs, interpreted ) [2 of 2] Compiling Main ( test.hs, interpreted ) test.hs:7:24: Not in scope: ‘processNum’ Failed, modules loaded: NumberUtil. *NumberUtil>
Update test.hs by removing processData
method, and reload test.hs.
test.hs
import NumberUtil removeLastDigit num = dropLastDigit num getMeLastDigit num = getLastDigit num
*NumberUtil> :load test.hs [1 of 2] Compiling NumberUtil ( NumberUtil.hs, interpreted ) [2 of 2] Compiling Main ( test.hs, interpreted ) Ok, modules loaded: NumberUtil, Main. *Main> *Main> removeLastDigit 123456 12345 *Main> *Main> getMeLastDigit 123456 6 *Main>
How
to export data types and constructors?
Name the type, and follow with the list
of value constructors in parenthesis.
TreeUtil.hs
module TreeUtil (Tree(Node, Empty)) where data Tree a = Node a (Tree a) (Tree a) | Empty deriving (Show)
No comments:
Post a Comment