hilbert 0.0.2700000
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/.coveralls.yml +2 -0
- data/.gitignore +23 -0
- data/.rubocop.yml +25 -0
- data/.travis.yml +5 -0
- data/Gemfile +9 -0
- data/Guardfile +33 -0
- data/LICENSE.txt +22 -0
- data/README.md +159 -0
- data/Rakefile +20 -0
- data/bin/qlang +29 -0
- data/core/Q/Lexer.hs +9 -0
- data/core/Q/Parser.hs +9 -0
- data/core/Q.hs +19 -0
- data/ext/qlang/QMatrix/q_matrix.c +0 -0
- data/ext/qlang/extconf.rb +3 -0
- data/ext/qlang/qlang.c +65 -0
- data/ext/qlang/qlang.h +6 -0
- data/legacy_rspec/langs/Haskell/ex1_after.hs +74 -0
- data/legacy_rspec/langs/Haskell/ex1_before.hs +74 -0
- data/legacy_rspec/langs/Python/ex1_after.py +93 -0
- data/legacy_rspec/langs/Python/ex1_before.py +95 -0
- data/legacy_rspec/langs/R/ex1_after.R +89 -0
- data/legacy_rspec/langs/R/ex1_before.R +89 -0
- data/legacy_rspec/objects/list_spec.rb +31 -0
- data/legacy_rspec/objects/matrix_spec.rb +55 -0
- data/legacy_rspec/objects/vector_spec.rb +47 -0
- data/lib/qlang/api/func_api.rb +17 -0
- data/lib/qlang/api/integral_api.rb +16 -0
- data/lib/qlang/api/limit_api.rb +22 -0
- data/lib/qlang/api/list_api.rb +16 -0
- data/lib/qlang/api/matrix_api.rb +20 -0
- data/lib/qlang/api/sigma_api.rb +16 -0
- data/lib/qlang/api/vector_api.rb +19 -0
- data/lib/qlang/api.rb +23 -0
- data/lib/qlang/exec.rb +64 -0
- data/lib/qlang/iq.rb +45 -0
- data/lib/qlang/lexer/base.rb +107 -0
- data/lib/qlang/lexer/formula_lexer.rb +20 -0
- data/lib/qlang/lexer/main_lexer.rb +34 -0
- data/lib/qlang/lexer/tokens.rb +94 -0
- data/lib/qlang/lexer.rb +11 -0
- data/lib/qlang/meta_info.rb +27 -0
- data/lib/qlang/parser/base.rb +7 -0
- data/lib/qlang/parser/formula_parser.rb +36 -0
- data/lib/qlang/parser/func_parser.rb +15 -0
- data/lib/qlang/parser/integral_parser.rb +15 -0
- data/lib/qlang/parser/limit_parser.rb +16 -0
- data/lib/qlang/parser/list_parser.rb +12 -0
- data/lib/qlang/parser/matrix_parser.rb +17 -0
- data/lib/qlang/parser/sigma_parser.rb +17 -0
- data/lib/qlang/parser/vector_parser.rb +13 -0
- data/lib/qlang/parser.rb +101 -0
- data/lib/qlang/utils/langs.yml +7 -0
- data/lib/qlang/utils/ruby_ext.rb +54 -0
- data/lib/qlang/version.rb +3 -0
- data/lib/qlang.rb +37 -0
- data/qlang.gemspec +28 -0
- data/test/internal/test_tokens.rb +35 -0
- data/test/interpreter/base.rb +17 -0
- data/test/interpreter/test_differential.rb +43 -0
- data/test/interpreter/test_function.rb +44 -0
- data/test/interpreter/test_general.rb +12 -0
- data/test/interpreter/test_integral.rb +38 -0
- data/test/interpreter/test_limit.rb +37 -0
- data/test/interpreter/test_matrix.rb +70 -0
- data/test/interpreter/test_sigma.rb +25 -0
- data/test/interpreter/test_vector.rb +28 -0
- data/test/langs/test_r.rb +32 -0
- data/test/langs/test_ruby.rb +9 -0
- data/test/minitest_helper.rb +8 -0
- data/test/q_matrix/test_q_matrix.rb +13 -0
- data/test/test_qlang.rb +24 -0
- metadata +203 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
MWNmNzJhODczNmNmYTAzZTEwZDMzMzAwMzY3YjYyODk1MGZkZTQzYg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NzY5Mjc1OWIyMjcyNDczZGYzZTljN2UyMDNjMzViMTVjZWQzN2U4Mw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZjUzYzk2MWFjNzk5NmJkMzExNTk0YzM2ZDU1N2QzODZiZGNkOTQ3OWQwNTg3
|
10
|
+
YWY4MDA4YzZiYmQ4NjZkYmM1NmY2MzM4Y2I3NmQyZmE4MWJhZjlmYTZiZDU2
|
11
|
+
Y2Y1NWYxODdiMjFjMjZkMWQ2YWQ0Njc1NTUzNGVjYmNkODQ1OGY=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZjNmMTBlZGMxNzc5OGQzNTVmOTg3MzAwYWNlOWJjMzNjMjkzZWYwN2U1Zjkz
|
14
|
+
NDVmZDQxODFlYzU1YzJjMmI5NjliOTI0MzM3YTM3NjdmZmFhYjU4M2NmZDc5
|
15
|
+
YTEzYzRmMWQxMjY3YzFjMGI5YzY2ZDA3MjdhYTIwNTgwMGVkZjI=
|
data/.coveralls.yml
ADDED
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
23
|
+
.ruby-version
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
Eval:
|
2
|
+
Enabled: false
|
3
|
+
|
4
|
+
LineLength:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
# Configuration parameters: AllowedVariables.
|
8
|
+
GlobalVars:
|
9
|
+
Enabled: false
|
10
|
+
|
11
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
12
|
+
MethodName:
|
13
|
+
Enabled: false
|
14
|
+
|
15
|
+
OpMethod:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
Void:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
SpaceInsideParens:
|
22
|
+
Enabled: false
|
23
|
+
|
24
|
+
SpaceAroundOperators:
|
25
|
+
Enabled: false
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
# Note: The cmd option is now required due to the increasing number of ways
|
5
|
+
# rspec may be run, below are examples of the most common uses.
|
6
|
+
# * bundler: 'bundle exec rspec'
|
7
|
+
# * bundler binstubs: 'bin/rspec'
|
8
|
+
# * spring: 'bin/rsspec' (This will use spring if running and you have
|
9
|
+
# installed the spring binstubs per the docs)
|
10
|
+
# * zeus: 'zeus rspec' (requires the server to be started separetly)
|
11
|
+
# * 'just' rspec: 'rspec'
|
12
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
13
|
+
watch(%r{^spec/.+_spec\.rb$})
|
14
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
15
|
+
watch('spec/spec_helper.rb') { "spec" }
|
16
|
+
|
17
|
+
# Rails example
|
18
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
19
|
+
watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
20
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
21
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
22
|
+
watch('config/routes.rb') { "spec/routing" }
|
23
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
24
|
+
watch('spec/rails_helper.rb') { "spec" }
|
25
|
+
|
26
|
+
# Capybara features specs
|
27
|
+
watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
|
28
|
+
|
29
|
+
# Turnip features and steps
|
30
|
+
watch(%r{^spec/acceptance/(.+)\.feature$})
|
31
|
+
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
32
|
+
end
|
33
|
+
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 gogotanaka
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
# Qlang
|
2
|
+
|
3
|
+
[](http://badge.fury.io/rb/qlang) [](https://travis-ci.org/gogotanaka/Q) [](https://coveralls.io/r/gogotanaka/Q?branch=master) [](https://codeclimate.com/github/gogotanaka/Q) [](https://gemnasium.com/gogotanaka/Q)
|
4
|
+
|
5
|
+
## Do you know the one best language in this world?
|
6
|
+
|
7
|
+
#### I believe mathematics is absolutely that one.
|
8
|
+
|
9
|
+
## How can we deal something as great as mathematics in a discrete world?
|
10
|
+
|
11
|
+
#### Q-language is the answer.
|
12
|
+
|
13
|
+
Q lets you have a sense of mathematics using a keyboard, the same as you would with a pen.
|
14
|
+
|
15
|
+
```
|
16
|
+
+---Discrete world---+ +------Mathematics-------+
|
17
|
+
| Ruby | | axiom |
|
18
|
+
| TeX |<------ Q ------>| Uncountable noun |
|
19
|
+
| Python | | real number topology |
|
20
|
+
+--------------------+ +------------------------+
|
21
|
+
```
|
22
|
+
|
23
|
+
## Demo
|
24
|
+
|
25
|
+
The code below is input and output for the q-lang interpreter
|
26
|
+
|
27
|
+
(you can try it by `qlang -i`)
|
28
|
+
|
29
|
+
### Differentiate
|
30
|
+
|
31
|
+
```
|
32
|
+
d/dx(cos(x))
|
33
|
+
=> ( - sin( x ) )
|
34
|
+
|
35
|
+
# You can omit parentheses
|
36
|
+
|
37
|
+
d/dx log(x)
|
38
|
+
=> ( 1 / x )
|
39
|
+
|
40
|
+
d/dy xy
|
41
|
+
=> ( x )
|
42
|
+
|
43
|
+
d/dx e^x
|
44
|
+
=> e ^ x
|
45
|
+
```
|
46
|
+
|
47
|
+
### Integrate
|
48
|
+
|
49
|
+
```
|
50
|
+
S(log(x)dx)[0..1]
|
51
|
+
=> - oo
|
52
|
+
|
53
|
+
S(sin(x)dx)[0..pi]
|
54
|
+
=> 2.0
|
55
|
+
|
56
|
+
S(cos(x)dx)[0..pi]
|
57
|
+
=> 0.0
|
58
|
+
```
|
59
|
+
|
60
|
+
### Limit
|
61
|
+
|
62
|
+
```
|
63
|
+
lim[x->oo] (1 + 1/x)^x
|
64
|
+
=> 2.7182682371744895
|
65
|
+
|
66
|
+
lim[x->0] 1/x
|
67
|
+
=> oo
|
68
|
+
```
|
69
|
+
|
70
|
+
### Sigma
|
71
|
+
```
|
72
|
+
∑[x=0,10] x
|
73
|
+
=> 55.0
|
74
|
+
```
|
75
|
+
|
76
|
+
### Matrix
|
77
|
+
|
78
|
+
```
|
79
|
+
(1 2 3; 4 5 6)
|
80
|
+
=> (1 2 3; 4 5 6)
|
81
|
+
|
82
|
+
(1 2 3; 4 5 6) + (1 2 3; 4 5 6)
|
83
|
+
=> (2 4 6; 8 10 12)
|
84
|
+
|
85
|
+
(1 2 3; 4 5 6) * (1 2 3)
|
86
|
+
=> (14 32)
|
87
|
+
```
|
88
|
+
|
89
|
+
### Function
|
90
|
+
```
|
91
|
+
f(x, y) = xy
|
92
|
+
f(1, 2)
|
93
|
+
=> 2
|
94
|
+
```
|
95
|
+
|
96
|
+
|
97
|
+
## How to use
|
98
|
+
|
99
|
+
Install qlang gem.
|
100
|
+
|
101
|
+
$ gem install qlang
|
102
|
+
|
103
|
+
## Interpreter
|
104
|
+
|
105
|
+
$ qlang -i
|
106
|
+
Q:->
|
107
|
+
|
108
|
+
## Use as native language
|
109
|
+
|
110
|
+
### Compile into R
|
111
|
+
|
112
|
+
$ qlang -r foo.q
|
113
|
+
|
114
|
+
### Compile into Ruby
|
115
|
+
|
116
|
+
$ qlang -rb foo.q
|
117
|
+
|
118
|
+
### Compile into Python
|
119
|
+
|
120
|
+
$ qlang -py foo.q
|
121
|
+
|
122
|
+
|
123
|
+
## Use as math template within other langs
|
124
|
+
|
125
|
+
|
126
|
+
```rb
|
127
|
+
class ExampleClass
|
128
|
+
def example_method
|
129
|
+
#your Ruby codes
|
130
|
+
......
|
131
|
+
|
132
|
+
I love mathematics.
|
133
|
+
a = (1 3 4)
|
134
|
+
# your Q codes
|
135
|
+
Q.E.D
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
139
|
+
```
|
140
|
+
|
141
|
+
$ qlang -rb example.rb
|
142
|
+
|
143
|
+
|
144
|
+
```rb
|
145
|
+
class ExampleClass
|
146
|
+
def example_method
|
147
|
+
#your Ruby codes
|
148
|
+
......
|
149
|
+
|
150
|
+
a = Vector[1, 3, 4]
|
151
|
+
|
152
|
+
end
|
153
|
+
end
|
154
|
+
```
|
155
|
+
|
156
|
+
## Contributing
|
157
|
+
|
158
|
+
Any PRs or issues are welcome.
|
159
|
+
You can become a commiter, even if you only commit once.
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
|
+
|
4
|
+
Rake::TestTask.new(:test) do |t|
|
5
|
+
t.libs << 'test'
|
6
|
+
t.test_files = FileList['test/**/test_*.rb']
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'rake/extensiontask'
|
10
|
+
|
11
|
+
Rake::ExtensionTask.new('qlang') do |ext|
|
12
|
+
ext.lib_dir = 'lib/qlang'
|
13
|
+
end
|
14
|
+
|
15
|
+
task :compile_and_test do
|
16
|
+
Rake::Task['compile'].invoke
|
17
|
+
Rake::Task['test'].invoke
|
18
|
+
end
|
19
|
+
|
20
|
+
task default: :compile_and_test
|
data/bin/qlang
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'qlang'
|
4
|
+
|
5
|
+
# Q command line
|
6
|
+
require 'qlang/exec'
|
7
|
+
|
8
|
+
# Q interpreter
|
9
|
+
require 'qlang/iq'
|
10
|
+
|
11
|
+
# TODO: There are vanch of todo ..
|
12
|
+
case ARGV.first
|
13
|
+
when '-i'
|
14
|
+
loop do
|
15
|
+
print 'Q:-> '
|
16
|
+
begin
|
17
|
+
input = $stdin.gets
|
18
|
+
output = Qlang::Iq.execute(input)
|
19
|
+
$stdout.puts output
|
20
|
+
rescue => e
|
21
|
+
puts e
|
22
|
+
end
|
23
|
+
end
|
24
|
+
when '-v'
|
25
|
+
puts Qlang::VERSION
|
26
|
+
when '-r', '-rb', '-py'
|
27
|
+
exec = Qlang::Exec::Compiler.new(ARGV)
|
28
|
+
exec.output!
|
29
|
+
end
|
data/core/Q/Lexer.hs
ADDED
data/core/Q/Parser.hs
ADDED
data/core/Q.hs
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
{- |
|
2
|
+
Module : Language.Q
|
3
|
+
Copyright : Kazuki Tanaka (a.k.a gogotanaka)
|
4
|
+
Licence : MIT
|
5
|
+
|
6
|
+
q-language.org.
|
7
|
+
-}
|
8
|
+
|
9
|
+
module Q
|
10
|
+
( module Q.Lexer
|
11
|
+
, module Q.Parser
|
12
|
+
, version
|
13
|
+
) where
|
14
|
+
|
15
|
+
|
16
|
+
import Q.Lexer
|
17
|
+
import Q.Parser
|
18
|
+
|
19
|
+
import Data.Version
|
File without changes
|
data/ext/qlang/qlang.c
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
#include "qlang.h"
|
2
|
+
#include <stdio.h>
|
3
|
+
#define Need_Float(x) do {if (!RB_TYPE_P(x, T_FLOAT)) {(x) = rb_to_float(x);}} while(0)
|
4
|
+
#define GET_FLOAT(x) Need_Float(x);(x) = RFLOAT_VALUE(x)
|
5
|
+
|
6
|
+
double func(double x)
|
7
|
+
{
|
8
|
+
return((x * x) * 3);
|
9
|
+
}
|
10
|
+
|
11
|
+
static VALUE
|
12
|
+
rb_func(VALUE self, VALUE x)
|
13
|
+
{
|
14
|
+
GET_FLOAT(x);
|
15
|
+
return(DBL2NUM((x * x)/2));
|
16
|
+
}
|
17
|
+
|
18
|
+
|
19
|
+
static VALUE
|
20
|
+
execute(VALUE self, VALUE a, VALUE b, VALUE n)
|
21
|
+
{
|
22
|
+
GET_FLOAT(a);
|
23
|
+
GET_FLOAT(b);
|
24
|
+
GET_FLOAT(n);
|
25
|
+
|
26
|
+
int i;
|
27
|
+
double s1=0.0, s2=0.0, d;
|
28
|
+
double x, y[n+1];
|
29
|
+
d=(b-a)/(double)n;
|
30
|
+
for(i=0; i<=n; i++)
|
31
|
+
{
|
32
|
+
x=(double)i*d+a;
|
33
|
+
y[i]=func(x);
|
34
|
+
}
|
35
|
+
for(i=1; i<=n-1; i+=2)
|
36
|
+
{
|
37
|
+
s1+=y[i];
|
38
|
+
}
|
39
|
+
for(i=2; i<=n-2; i+=2)
|
40
|
+
{
|
41
|
+
s2+=y[i];
|
42
|
+
}
|
43
|
+
|
44
|
+
double s=(y[0]+4.0*s1+2.0*s2+y[n])*d/3.0;
|
45
|
+
|
46
|
+
return DBL2NUM(s);
|
47
|
+
}
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
void
|
52
|
+
Init_qlang(void)
|
53
|
+
{
|
54
|
+
VALUE rb_mQMatrix = rb_define_class("QMatrix", rb_cObject);
|
55
|
+
rb_define_method(rb_mQMatrix, "execute", execute, 3);
|
56
|
+
rb_define_method(rb_mQMatrix, "func", rb_func, 1);
|
57
|
+
}
|
58
|
+
|
59
|
+
// VALUE rb_mQMatrix;
|
60
|
+
|
61
|
+
// void
|
62
|
+
// Init_q_matrix(void)
|
63
|
+
// {
|
64
|
+
// rb_mQMatrix = rb_define_module("QMatrix");
|
65
|
+
// }
|
data/ext/qlang/qlang.h
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
module Main where
|
2
|
+
|
3
|
+
filter' :: (a -> Bool) -> [a] -> [a]
|
4
|
+
filter' _ [] = []
|
5
|
+
filter' p (x:xs) | p x = x : filter' p xs
|
6
|
+
| otherwise = filter' p xs
|
7
|
+
|
8
|
+
|
9
|
+
-- pattern match for Algebraic data type
|
10
|
+
data Node = Leaf Integer | Branch Node Node deriving (Show)
|
11
|
+
|
12
|
+
depth :: Node -> Integer
|
13
|
+
depth node = case node of
|
14
|
+
Leaf _ -> 1
|
15
|
+
Branch a b -> 1 + max (depth a) (depth b)
|
16
|
+
|
17
|
+
sumLeaf :: Node -> Integer
|
18
|
+
sumLeaf node = case node of
|
19
|
+
Leaf x -> x
|
20
|
+
Branch a b -> (sumLeaf a) + (sumLeaf b)
|
21
|
+
|
22
|
+
-- Maybe monado
|
23
|
+
|
24
|
+
--data Maybee a = Justt a | Nothingg deriving (Show)
|
25
|
+
|
26
|
+
--return :: a -> Maybee a
|
27
|
+
--return a = Maybee a
|
28
|
+
|
29
|
+
--(>>=) :: Maybee a -> (a -> Maybee b) -> Maybee b
|
30
|
+
--Nothingg >>= _ = Nothingg
|
31
|
+
--Justt a >>= f = f a
|
32
|
+
|
33
|
+
add1 :: Maybe Int -> Maybe Int -> Maybe Int
|
34
|
+
add1 mx my =
|
35
|
+
case mx of
|
36
|
+
Nothing -> Nothing
|
37
|
+
Just x -> case my of
|
38
|
+
Nothing -> Nothing
|
39
|
+
Just y -> Just (x + y)
|
40
|
+
|
41
|
+
add2 :: Maybe Int -> Maybe Int -> Maybe Int
|
42
|
+
add2 mx my =
|
43
|
+
mx >>= (\x ->
|
44
|
+
my >>= (\y ->
|
45
|
+
return (x + y)))
|
46
|
+
|
47
|
+
add3 :: Maybe Int -> Maybe Int -> Maybe Int
|
48
|
+
add3 mx my = do
|
49
|
+
x <- mx
|
50
|
+
y <- my
|
51
|
+
return (x + y)
|
52
|
+
|
53
|
+
|
54
|
+
putResult x = putStrLn $ show x
|
55
|
+
|
56
|
+
|
57
|
+
main = do putResult $ filter' (> 2) [1..10]
|
58
|
+
|
59
|
+
let tree = Branch (Leaf 3) (Branch (Leaf 2) (Leaf 4))
|
60
|
+
putResult $ depth tree
|
61
|
+
putResult $ sumLeaf tree
|
62
|
+
|
63
|
+
putResult $ (Just 1) `add1` Nothing
|
64
|
+
putResult $ Nothing `add1` (Just 3)
|
65
|
+
putResult $ (Just 1) `add1` (Just 3)
|
66
|
+
putResult $ Nothing `add1` Nothing
|
67
|
+
putResult $ (Just 1) `add2` Nothing
|
68
|
+
putResult $ Nothing `add2` (Just 3)
|
69
|
+
putResult $ (Just 1) `add2` (Just 3)
|
70
|
+
putResult $ Nothing `add2` Nothing
|
71
|
+
putResult $ (Just 1) `add3` Nothing
|
72
|
+
putResult $ Nothing `add3` (Just 3)
|
73
|
+
putResult $ (Just 1) `add3` (Just 3)
|
74
|
+
putResult $ Nothing `add3` Nothing
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Main where
|
2
|
+
|
3
|
+
filter' :: (a -> Bool) -> [a] -> [a]
|
4
|
+
filter' _ [] = []
|
5
|
+
filter' p (x:xs) | p x = x : filter' p xs
|
6
|
+
| otherwise = filter' p xs
|
7
|
+
|
8
|
+
|
9
|
+
-- pattern match for Algebraic data type
|
10
|
+
data Node = Leaf Integer | Branch Node Node deriving (Show)
|
11
|
+
|
12
|
+
depth :: Node -> Integer
|
13
|
+
depth node = case node of
|
14
|
+
Leaf _ -> 1
|
15
|
+
Branch a b -> 1 + max (depth a) (depth b)
|
16
|
+
|
17
|
+
sumLeaf :: Node -> Integer
|
18
|
+
sumLeaf node = case node of
|
19
|
+
Leaf x -> x
|
20
|
+
Branch a b -> (sumLeaf a) + (sumLeaf b)
|
21
|
+
|
22
|
+
-- Maybe monado
|
23
|
+
|
24
|
+
--data Maybee a = Justt a | Nothingg deriving (Show)
|
25
|
+
|
26
|
+
--return :: a -> Maybee a
|
27
|
+
--return a = Maybee a
|
28
|
+
|
29
|
+
--(>>=) :: Maybee a -> (a -> Maybee b) -> Maybee b
|
30
|
+
--Nothingg >>= _ = Nothingg
|
31
|
+
--Justt a >>= f = f a
|
32
|
+
|
33
|
+
add1 :: Maybe Int -> Maybe Int -> Maybe Int
|
34
|
+
add1 mx my =
|
35
|
+
case mx of
|
36
|
+
Nothing -> Nothing
|
37
|
+
Just x -> case my of
|
38
|
+
Nothing -> Nothing
|
39
|
+
Just y -> Just (x + y)
|
40
|
+
|
41
|
+
add2 :: Maybe Int -> Maybe Int -> Maybe Int
|
42
|
+
add2 mx my =
|
43
|
+
mx >>= (\x ->
|
44
|
+
my >>= (\y ->
|
45
|
+
return (x + y)))
|
46
|
+
|
47
|
+
add3 :: Maybe Int -> Maybe Int -> Maybe Int
|
48
|
+
add3 mx my = do
|
49
|
+
x <- mx
|
50
|
+
y <- my
|
51
|
+
return (x + y)
|
52
|
+
|
53
|
+
|
54
|
+
putResult x = putStrLn $ show x
|
55
|
+
|
56
|
+
|
57
|
+
main = do putResult $ filter' (> 2) [1..10]
|
58
|
+
|
59
|
+
let tree = Branch (Leaf 3) (Branch (Leaf 2) (Leaf 4))
|
60
|
+
putResult $ depth tree
|
61
|
+
putResult $ sumLeaf tree
|
62
|
+
|
63
|
+
putResult $ (Just 1) `add1` Nothing
|
64
|
+
putResult $ Nothing `add1` (Just 3)
|
65
|
+
putResult $ (Just 1) `add1` (Just 3)
|
66
|
+
putResult $ Nothing `add1` Nothing
|
67
|
+
putResult $ (Just 1) `add2` Nothing
|
68
|
+
putResult $ Nothing `add2` (Just 3)
|
69
|
+
putResult $ (Just 1) `add2` (Just 3)
|
70
|
+
putResult $ Nothing `add2` Nothing
|
71
|
+
putResult $ (Just 1) `add3` Nothing
|
72
|
+
putResult $ Nothing `add3` (Just 3)
|
73
|
+
putResult $ (Just 1) `add3` (Just 3)
|
74
|
+
putResult $ Nothing `add3` Nothing
|