singalen: (sun)
[personal profile] singalen
Присели наконец с [livejournal.com profile] vbayda поковырять Хаскелль и сделать хоть что-то. Довели до компилируемости примерчик с байндингом параметров функций. Чуть лучше запомнили приоритеты букварь - операторов и функций :)
Вспомнили:
1. Оператор $ - это оператор ленивого ("обычного") вызова функции.
2. Параметрический тип Maybe a: data Maybe a = Just a | Nothing;
Это "nullable", проверяемый компилятором - мечта одного моего знакомого для Джавы :)
3. Анонимные параметры функции (через pattern matching).
module Main
  where

import Data.List
import Data.Maybe

-- это описание типа данных - "записи" с конструктором и одним полем
data Entity = Entity { circle :: Circle }
data Position = Position { x, y :: Float }
data Circle = Circle { position :: Position, r :: Float }

circlesIntersect :: Circle -> Circle -> Bool
circlesIntersect c1 c2 = 
  sqr (r c1 + r c2) < 
    sqr ((x $ position c1) - (x $ position c2)) + sqr ((y $ position c1) - (y $ position c2))
  where sqr = (^2)

-- второй вариант, покороче.  
circlesIntersect2 :: Circle -> Circle -> Bool
circlesIntersect2 (Circle p1 r1) (Circle p2 r2) = 
  sqr (r1 + r2) < sqr (x p1 - x p2) + sqr (y p1 - y p2)
  where sqr = (^2)

-- найти первую (или никакую) entity, circle которой пересекается с указанным Circle.
findIntersecting :: Circle -> [Entity] -> Maybe Entity
findIntersecting theCircle entities =
  find entityMatches entities
  where
    entityMatches :: Entity -> Bool
    entityMatches e = circlesIntersect theCircle (circle e)

--findIntersecting theCircle entities =
--  find ((circlesIntersect theCircle) . circle) entities

(no subject)

11/2/07 10:24 (UTC)
Posted by [identity profile] nponeccop.livejournal.com
А Clean вам не интересен?

(no subject)

11/2/07 13:26 (UTC)
Posted by [identity profile] nponeccop.livejournal.com
Вот ваш пример в переводе на Clean (http://nponeccop.livejournal.com/85287.html).

(no subject)

11/2/07 13:48 (UTC)
Posted by [identity profile] aleksijb.livejournal.com
Раз пошла такая пьянка, то вот на прологе:

intersect(circle(X1, Y1, R1), entity(circle(X2, Y2, R2))) :-
	(R1+R2)*(R1+R2) >= (X1 - X2)*(X1 - X2) + (Y1 - Y2)*(Y1-Y2).

findIntersection(Circle, Entities, X) :-
        member(X, Entities),
	intersect(Circle, X).

(no subject)

11/2/07 13:53 (UTC)
Posted by [identity profile] nponeccop.livejournal.com
Ну, это не совсем пьянка. Clean и Haskell - оба чисто функциональные языки со статической типизацией, компилируемые в быстрый native-код. Пролог нервно курит в коридоре.

(no subject)

11/2/07 15:23 (UTC)
Posted by [identity profile] nponeccop.livejournal.com
Я не говорю что пролог плох. Просто слегка не в тему

(no subject)

11/2/07 15:28 (UTC)
Posted by [identity profile] aleksijb.livejournal.com
Кстати есть функционально-логические языки.

(no subject)

11/2/07 17:13 (UTC)
Posted by [identity profile] nponeccop.livejournal.com
Я даже не знал что есть логические языки, кроме Пролога.

(no subject)

11/2/07 17:25 (UTC)
Posted by [identity profile] nponeccop.livejournal.com
И лямбда-Пролога.

(no subject)

11/2/07 23:16 (UTC)
Posted by [identity profile] nponeccop.livejournal.com
Так давайте биться вместе. Я вот хочу освоить клин по-человечески. Будем меняться исходниками и впечатлениями и портировать друг друга.

(no subject)

12/2/07 19:53 (UTC)
Posted by [identity profile] nponeccop.livejournal.com
Ну, у меня довольно меркантильные соображения (http://nponeccop.livejournal.com/85672.html).