-
Notifications
You must be signed in to change notification settings - Fork 1
/
Main.hs
117 lines (96 loc) · 2.56 KB
/
Main.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
{-
Modules and compilation
=============
-}
-- import Data.Char -- import all public functions
-- import Data.Char hiding (toLower) -- import all public functions expect
-- `toLower`
-- >>> toLower 'C'
-- 'c'
import Data.Char (toLower, toUpper)
-- >>> toUpper 'a'
-- 'A'
import Data.List
import qualified Data.Set
-- ↑↑↑↑↑↑↑↑↑
-- ╰┴┴┴┴┴┴┴┤
-- ╰──╮
-- NOTE: output without `qualified`
-- > :t union
-- Ambiguous occurrence `union'
-- It could refer to
-- either `Data.Set.union',
-- imported from `Data.Set'
-- (and originally defined in `Data.Set.Internal')
-- or `Data.List.union',
-- imported from `Data.List'
-- (and originally defined in `base-4.14.3.0:Data.OldList')
-- import qualified Data.Set as Set
-- > :t
-- Set.union :: Ord a => ...
{-
TASK
====
Что произойдет при попытке загрузить данный модуль в GHCi?
> module Test where
> import Data.List hiding (union)
> import Data.Set
>
> myUnion [] ys = ys
> myUnion xs ys = union xs ys
SOLUTION
========
( ) Все пройдет нормально
( ) Произойдет ошибка из-за неопределенности при выборе функции
(x) Произойдет ошибка из-за несовпадения типа аргумента и ожидаемого типа
функции
-}
import Test
-- f1 = const42 True
-- ↑↑↑↑↑↑↑
-- we cannot use a private function from `Test` module
f2 = sumIt 3 4
-- > :l Main
-- [1 of 2] Compiling Test ( Test.hs, interpreted )
-- [2 of 2] Compiling Main ( Main.hs, interpreted )
-- Ok, two modules loaded.
-- > f2
-- 7
{-
TASK
====
Пусть модуль `Foo` содержит следующий код:
> module Foo (a, b) where
>
> a = undefined
> b = undefined
> c = undefined
а модуль `Bar` такой:
> module Bar (a, d) where
>
> import Foo (a, b)
>
> d = undefined
Отметьте функции, доступные для использования после загрузки в модуле `Baz`
со следующим кодом:
> module Baz where
>
> import Bar
SOLUTION
========
[ ] c
[x] d
[ ] b
[x] a
-}
{-
Compilation stages
------------------
1) Syntax parse
2) Type checking
3) Desugaring into "Core" language (lower level)
4) Optimization
5) Code generation: "Core" code --> STG machine code
6) STG machine code --> C-- ()
7) C-- --> ASM (or LLVM, depends on selected compile backend)
-}