DateTime.now - DateTime.now
Помнится, недалекие люди недавно что-то имели против руби-стайл блоков в C. Awe and behold: fn main() { for [1, 2, 3].each {|i| io::println(#fmt("hello, %d", i)); } } http://www.rust-lang.org/
Что за мудак настраивал мое железо? w83627ehf-isa-0290 Adapter: ISA adapter Vcore: +1.23 V (min = +0.00 V, max = +1.74 V) in1: +1.91 V (min = +2.04 V, max = +2.04 V) ALARM AVCC: +3.38 V (min = +4.08 V, max = +3.06 V) ALARM +3.3V: +3.38 V (min = +3.82 V, max = +4.08 V) ALARM in4: +1.70 V (min = +2.04 V, max = +1.46 V) ALARM in5: +1.61 V (min = +2.04 V, max = +2.04 V) ALARM in6: +1.61 V (min = +2.04 V, max = +2.04 V) ALARM 3VSB: +3.38 V (min = +4.08 V, max = +4.08 V) ALARM Vbat: +3.30 V (min = +4.08 V, max = +2.54 V) ALARM in9: +1.65 V (min = +2.04 V, max = +2.04 V) ALARM fan1: 0 RPM (min = 0 RPM, div = 128) fan2: 88 RPM (min = 0 RPM, div = 128) fan3: 0 RPM (min = 0 RPM, div = 128) fan5: 0 RPM (min = 0 RPM, div = 128) temp1: +39.0°C (high = -1.0°C, hyst = -1.0°C) ALARM sensor = thermistor temp2: +52.0°C (high = +80.0°C, hyst = +75.0°C) sensor = diode temp3: +46.0°C (high = +80.0°C, hyst = +75.0°C) sensor = thermistor cpu0_vid: +1.225 V
Народ, объясните мне, чем полезны стрелки в Хаскелле. Я понимаю, что это по сути обогащенные над (Hask, \times, 1) категории, но почему они полезны в программировании, какой аспект вычислений они так хорошо моделируют?
Подсчет листьев в дереве (по мотивам SICP): import qualified Data.Foldable import qualified Data.Monoid data Tree a = Leaf a | Forest [Tree a] deriving Show toList :: Tree a -> [a] toList = Data.Foldable.foldMap return instance Functor Tree where fmap f (Leaf x) = Leaf (f x) fmap f (Forest xs) = Forest (fmap (fmap f) xs) instance Data.Foldable.Foldable Tree where foldMap f (Leaf x) = f x foldMap f (Forest xs) = Data.Monoid.mconcat $ fmap (Data.Foldable.foldMap f) xs leafCount = Data.Monoid.getSum . Data.Foldable.foldMap (const (Data.Monoid.Sum 1)) x = Forest [ Forest [Leaf 1, Leaf 2], Leaf 3, Leaf 4] main = do putStrLn $ show $ leafCount x С одной стороны - тривиальная вещь, с другой - тот факт, что сама функция leafCount становится однострочником, внушает 8)
(define (sparta x) ((x x) x)) (sparta sparta) Классика :)
В связи с #1745106 о dependent types Хотелось бы иметь что-то вроде этого: type Permutation a = [a] -> [a] permutation :: [Int] -> Permutation a permutation fs xs = go 0 where n = length fs go i = if i < n then (xs !! (fs !! i)):go (i + 1) else [] ?????? permarg [0, 2, 1] function 1 2 "Hello" В сети есть примеры этого, но там все жестко, натуральные числа и операции с ними кодирутся типами :))) Вопрос знающим людям: чтобы дополнить Хаскелл функционалом dependent types, многое ли пришлось бы изменить?
Ура, я понял монаду IO :D http://stackoverflow.com/questions/9074284/understanding-bind-function-in-haskell/9076812#comment11440692_9076812 Архитектурно получается двоякая интерпретация input -> computation -> output: с одной стороны, идет разделение IO (фундаментально лучше описываемого с помощью конечных автоматов) и вычислений (фундаментально лучше описываемых с помощью лямбда-исчисления), с другой, имеем последовательность "двойного перевода": 1) Компилятор переводит вычисления с компьютерного (FSA) языка на человеческий (лямбда-исчисление), 2) Человек решает задачу, строя вычисления в монаде IO, 3) Компилятор переводит описание этой задачи с лямбда-исчисления назад на язык компьютера. Получается, что "на данном этапе развития науки и техники" монада IO решает свою задачу теоретически оптимальным образом 8)
Xer? I hardly know 'er! Finger trees: структура данных, обобщающая списки с произвольным доступом и очереди с приоритетом с помощью моноидов 8) http://apfelmus.nfshost.com/articles/monoid-fingertree.html
Скажу очевидное: С++ - язык из костылей: 1) Костыли вместо массивов, 2) Костыли вместо строк, 3) Костыли вместо списков, 4) Костыли вместо каррирования, 5) В 2011 наконец-то избавились от костыля вместо замыканий - ура, теперь это почти что высокоуровневый язык!
Жуйк, как сделать это из баша? #include <unistd.h> #include <sys/types.h> #include <sys/ioctl.h> int main (int argc, char **argv) { pid_t pid; /* * parent exits * child gets rid of its tty and then shift-runs its arguments */ pid = fork(); if (pid < 0) { return 1; } else if (pid == 0) { ioctl (0, TIOCNOTTY); execvp (argv[1], argv + 1); } else { return 0; } }