← All posts tagged code

Kallikanzarid
code
Что за мудак настраивал мое железо?


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
Kallikanzarid
code математика Haskell
Народ, объясните мне, чем полезны стрелки в Хаскелле. Я понимаю, что это по сути обогащенные над (Hask, \times, 1) категории, но почему они полезны в программировании, какой аспект вычислений они так хорошо моделируют?
Kallikanzarid
code
Подсчет листьев в дереве (по мотивам 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)
Kallikanzarid
code
В связи с #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, многое ли пришлось бы изменить?
Kallikanzarid
code математика
Ура, я понял монаду 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)
Kallikanzarid
code obvious
Скажу очевидное: С++ - язык из костылей:
1) Костыли вместо массивов,
2) Костыли вместо строк,
3) Костыли вместо списков,
4) Костыли вместо каррирования,
5) В 2011 наконец-то избавились от костыля вместо замыканий - ура, теперь это почти что высокоуровневый язык!
Kallikanzarid
code Linux
Жуйк, как сделать это из баша?

#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;
	}

}