hilbert 0.0.2700000
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Gem Version](https://badge.fury.io/rb/qlang.svg)](http://badge.fury.io/rb/qlang) [![Build Status](https://travis-ci.org/gogotanaka/Q.svg?branch=master)](https://travis-ci.org/gogotanaka/Q) [![Coverage Status](https://coveralls.io/repos/gogotanaka/Q/badge.png?branch=master)](https://coveralls.io/r/gogotanaka/Q?branch=master) [![Code Climate](https://codeclimate.com/github/gogotanaka/Q/badges/gpa.svg)](https://codeclimate.com/github/gogotanaka/Q) [![Dependency Status](https://gemnasium.com/gogotanaka/Q.svg)](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
|