Показаны сообщения с ярлыком haskell. Показать все сообщения
Показаны сообщения с ярлыком haskell. Показать все сообщения

2013-05-08

Много видал я извращений с макросами, но такого ...

Cello is a GNU99 C library which brings higher level programming to C.

Interfaces allow for structured design;
Duck Typing allows for generic functions;
Exceptions control error handling;
Constructors/Destructors aid memory management;

Ссылки на примеры:
Пример программы:

#include "Cello.h"

int main(int argc, char** argv) {

  /* Tables require "Eq" and "Hash" on key type */
  var prices = new(Table, String, Int);
  put(prices, $(String, "Apple"),  $(Int, 12)); 
  put(prices, $(String, "Banana"), $(Int,  6)); 
  put(prices, $(String, "Pear"),   $(Int, 55));

  /* Tables also supports iteration */
  foreach (key in prices) {
    var price = get(prices, key);
    print("Price of %$ is %$\n", key, price);
  }

  /* "with" automatically closes file at end of scope. */
  with (file in open($(File, NULL), "prices.bin", "wb"))) {

    /* First class function object */
    lambda(write_pair, args) {

      /* Run time type-checking with "cast" */
      var key = cast(at(args, 0), String);
      var val = cast(get(prices, key), Int);

      try {
        print_to(file, 0, "%$ :: %$\n", key, val);
      } catch (e in IOError) {
        println("Could not write to file - got %$", e)
      }

      return None;
    };

    /* Higher order functions */
    map(prices, write_pair);
  }

  delete(prices);
}

На что только люди не пойдут, чтоб на С++ не писать.

2012-09-04

А что, можно было?

Чувствую себя слоупоком. Решив почти полторы сотни задач с Эйлера на Хаскелле, открыл для себя разницу между "ghc -O2" и runhaskell.
runhaskell 136.hs
- около 5 минут
ghc -02 136.hs && ./136
- 15 секунд.

2012-08-31

Элементы ФП в ObjC (BlocksKit)

Когда-то жаловался, что ObjC у массива нету поиска по условию.
Нашел фреймворк, который позволяет писать на ObjC "функциональненько".
3 типа map (each:, apply:, map:), filter (select:, reject:), find(match:), any, all, none, fold (reduce:withBlock:). Плюс in-place варианты для мутабельных коллекций (performMap:, performSelect:, performReject:). Все принимают блок (ака лямбда).
Имхо, эта штука должна быть в ObjC "искаропки".

2012-05-15

Внезапно: чего не хватает в Хаскеле, языке, где все иммутабельно, так это нормальной поддержки энумов/констант в паттерн-матчинге.
Кусок из Эйлер-84
prob d 12 {-U1  -} = d 12 + cardP (d 7 + d 36)
prob d 15 {-R2  -} = d 15 + cardP 2 * d 7
prob d 17 {-CC2 -} = ccP * d 17
prob d 19 {-D3  -} = d 19 + cardP (d 22)
prob d 22 {-CH2 -} = chP * d 22
Если б вместо чисел были константы, было б читабельнее.

Upd. Я слоупок, есть же class Enum.

2012-04-24

Эльфы 14-го уровня среди нас. Чувствую себя лузером со своими 4/115.

2012-01-10

status $ haskell + projectEuler

Продолжаю на досуге мучить haskell и решать задачки с "Проекта Эйлер".
Решил over 90 задач, уже в топ-50 по Украине
Среди знакомых ников в первой сотне есть adept и jdevelop (оба тоже с haskell)
Задачки разные -- в основном всякий матан: простые числа, числа фибоначчи, "фигурные" числа, функция Эйлера, Диофантовы уравнения, цепные дроби, комбинаторика... посчитать сумму, посчитать разность... посчитать кол-во, найти минимум ....
Есть немного динпрога, часто в в виде задач на поиск пути.
Пару задач уже встречал то-ли на ACM, то ли на тренировках к нему.
Из более "прикладных" задач понравилось "54: даны карты двух игроков в покер. определить, сколько раз выиграл первый", "59: дан неизвестный текстовый файл, зашифрованный xor-ом c 3-хсимвольным неизвестным паролем, расшифровать брутфорсом" и "96: написать решалку судоку",

2011-12-21

euler-69

Пишешь алгоритм. Он тормозит. Прикидываешь, понимаешь, что в ближайшие сутки он не досчтитает.
Гуглишь. Оптимизируешь. Рассчетное время -- уже в часах.
Видишь закономерность. Рассчет ускорился в несколько раз.
Еще одну. Через пару секунд получаешь ответ.
А потом понимаешь, что ответ можно получить за ту же пару секунд на любом калькуляторе.
Или даже просто посчитать на листике бумаги. 

2011-11-09

Euler

1
sum x = x * n * (n + 1) `div` 2 where n = 999 `div` x
solve = sum 3 + sum 5 - sum (3*5)

2

add x acc = if even x then acc + x else acc
fib a b acc = if b > 4000000 then acc else fib b b' acc'
  where b' = a + b
           acc' = add b acc
solve = fib 1 1 0

3 Пытался делать через решето Эратосфена. Тупит. Тупой брутфорс сразу дал ответ

source = 600851475143 
divide s x  
  | s == x = x
  | s `mod` x == 0 = divide (s `div` x) x
  | otherwise = divide s (x + 2) 

solve = divide source 3