Ruby with Type.
Matz has mentioned Ruby3.0 with static type at some confluences. But almost all rubyists(include me) are not sure how typed Ruby is.
But it's worth thinking more. This gem is kind of trial without so much side-effect.
require 'haskell'
# ex1: (Ruby 2.1.0+)
class MyClass
type Numeric, Numeric >= Numeric, def sum(x, y)
x + y
end
type Numeric, Numeric >= Numeric, def wrong_sum(x, y)
'string'
end
end
MyClass.new.sum(1, 2)
#=> 3
MyClass.new.sum(1, 'string')
#=> ArgumentError: Wrong type of argument, type of "str" should be Numeric
MyClass.new.wrong_sum(1, 2)
#=> TypeError: Expected wrong_sum to return Numeric but got "str" instead
# ex2: (Ruby 2.1.0+)
class People
type People >= Any, def marry(people)
# Your Ruby code as usual
end
end
People.new.marry(People.new)
#=> no error
People.new.marry('non people')
#=> ArgumentError: Wrong type of argument, type of "non people" should be People
# ex3: (Ruby 1.8.0+)
class MyClass
def sum(x, y)
x + y
end
type Numeric, Numeric >= Numeric, :sum
end
Feature
Typed method can coexist with non-typed method
# It's totally OK!!
class MyClass
type Numeric, Numeric >= Numeric, def sum(x, y)
x + y
end
def wrong_sum(x, y)
'string'
end
end
Duck typing
class MyClass
type Any >= Numeric, def foo(any_obj)
1
end
end
# It's totally OK!!
MyClass.new.foo(1)
# It's totally OK!!
MyClass.new.foo('str')
Installation
Add this line to your application's Gemfile:
gem 'haskell'
And then execute:
$ bundle
Or install it yourself as:
$ gem install haskell
Contributing
Fork it ( https://github.com/[my-github-username]/haskell/fork )
Create your feature branch (git checkout -b my-new-feature)
$ bundle install --path vendor/bundle
Commit your changes (git commit -am 'Add some feature')
$ bundle exec rake test
> 5 runs, 39 assertions, 0 failures, 0 errors, 0 skips
Push to the branch (git push origin my-new-feature)
Create a new Pull Request
Credits
@chancancode first brought this to my attention. I've stolen some idea from him.