18 June 2018
abs()’s issue
abs() function ins C/C++ is not defined for minimum negative int as the standard says:
The abs, labs, and llabs functions compute the absolute value of an integer j. If the result cannot be represented, the behavior is undefined.
gcc returns the same value in this case.
Heap’s data structure
Heap’s implementations do not have some useful functions like change_key
or remove_element
in many languages. E.g. in C++ and Python.
Go’s implementaion actualy has both of the functions named as Fix() and Remove(): Package heap.
Combining hash values
XOR
is not always the best choice to combine hash values. E.g. for a pair of int it will always returns 0 if values are the same.
Boost uses the following approach to avoid such collisions:
template <class T>
inline void hash_combine(std::size_t& seed, const T& v)
{
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
seed
is a previous result of hasher
or this algorithm.
Some good advices are available in Writing a hash function in Java: a practical guide to implementing hashCode() (suitable not only for Java, of course).
Facebook’s ReasonML
Facebook decided to create Frankenstein: a hybrid of JavaScript and ML. It looks a bit scary to me:
// A FizzBuzz implementation in ReasonML
let fizzbuzz = (i) =>
switch ([i mod 3, i mod 5]) {
| [0, 0] => "FizzBuzz"
| [0, _] => "Fizz"
| [_, 0] => "Buzz"
| _ => string_of_int(i)
};
for (i in 1 to 100) {
print_endline(fizzbuzz(i));
};
This piece of code taken from the article: ReasonML - React as first intended.
ML family
There are quite a few languages in ML family:
OCaml - ML with Object Oriented features;
F# - better version of OCaml (IMHO);
BuckleScript - OCaml’s compiler to JavaScript;
Fable - F#’s compiler to JavaScript;
Elm - Haskell mutated into something ML-like, compiles to JavaScript.