۱۳ - ۵صادراتی‌های ماژول

بطور پیش‌فرض، اگه هیچ صادراتی در ماژول ِتون تعیین نکنین، همه‌ی انقیادهای سطح بالا صادر، و قابلِ وارد کردن به سایرِ ماژول‌ها میشن. ماژول ِ ‏‎Hello‎‏ همینطور بود:

module Hello where

sayHello :: IO ()
sayHello = do
  putStrLn "hello world"

اما چه اتفاقی میوفته اگه یه لیستِ خالی از صادرها بدیم؟

module Hello
  ()
  where

sayHello :: IO ()
sayHello = do
  putStrLn "hello world"

اگه بسازیم، خطای زیر رو میده:

Not in scope: ‘sayHello’

میشه صراحتاً اون تابع رو به لیستِ صادرها اضافه کنیم:

module Hello
  ( sayHello )
  where

sayHello :: IO ()
sayHello = do
  putStrLn "hello world"

حالا تابعِ ‏‎sayHello‎‏ صادر میشه. تو این پروژه به نظر بی‌خود میاد، اما در پروژه‌های بزرگتر گاهی اوقات به کار میاد.

افشا کردنِ ماژول‌ها

اول یه ماژول ِ جدید با یه اجراییه ِ IO اضافه می‌کنیم تا به ‏‎main‎‏ بدیم:

-- src/DogsRule.hs
module DogsRule
  ( dogs )
  where

dogs :: IO ()
dogs = do
  putStrLn "Who's a good puppy?!"
  putStrLn "YOU ARE!!!!!"

بعد هم ماژول ِ ‏‎Main‎‏ ِمون رو تغییر میدیم که ازش استفاده کنه:

module Main where

import DogsRule
import Hello

main :: IO ()
main = do
  sayHello
  dogs

اما اگه بسازیم‌ِش، خطا می‌گیریم:

Could not find module ‘DogsRule’
-- پیدا نشد ‘DogsRule’ م. ماژولِ

مثلِ بالا، ماژول ِ ‏‎DogsRule‎‏ رو باید در پاراگراف ِ ‏‎library‎‏ افشا کنیم:

library
  hs-source-dirs:      src
  exposed-modules:     DogsRule
                     , Hello
  build-depends:       base >= 4.7 && < 5
  default-language:    Haskell2010

دیگه می‌تونه حکومتِ سگ‌ها رو پیدا کنه.