(no subject)
10/2/07 15:56Присели наконец с
vbayda поковырять Хаскелль и сделать хоть что-то. Довели до компилируемости примерчик с байндингом параметров функций. Чуть лучше запомнили приоритеты букварь - операторов и функций :)
Вспомнили:
1. Оператор $ - это оператор ленивого ("обычного") вызова функции.
2. Параметрический тип Maybe a: data Maybe a = Just a | Nothing;
Это "nullable", проверяемый компилятором - мечта одного моего знакомого для Джавы :)
3. Анонимные параметры функции (через pattern matching).
Вспомнили:
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) entitiesTags:
(no subject)
10/2/07 14:48 (UTC)(no subject)
11/2/07 07:14 (UTC)import Data.List import Data.Maybe data Entity a = Entity { circle :: Circle a} data Position a = Position {x, y :: a} data Circle a = Circle {position :: (Position a), r :: a} entityIntersect (Circle p1 r1) (Entity(Circle p2 r2)) = sqr (r1 + r2) < sqr (x p1 - x p2) + sqr (y p1 - y p2) where sqr = (^2) findIntersecting x entities = find (entityIntersect x) entities(no subject)
11/2/07 09:17 (UTC)Но так не компилится
(no subject)
11/2/07 13:02 (UTC)(no subject)
11/2/07 13:36 (UTC)(no subject)
11/2/07 10:24 (UTC)(no subject)
11/2/07 13:26 (UTC)(no subject)
11/2/07 13:48 (UTC)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)(no subject)
11/2/07 14:59 (UTC)(no subject)
11/2/07 15:23 (UTC)(no subject)
11/2/07 15:28 (UTC)(no subject)
11/2/07 17:13 (UTC)(no subject)
11/2/07 17:25 (UTC)(no subject)
11/2/07 17:33 (UTC)http://mitpress.mit.edu/0262562146
(no subject)
11/2/07 21:36 (UTC)Далее в вашем посте.
(no subject)
11/2/07 23:16 (UTC)(no subject)
12/2/07 10:19 (UTC)Будем публиковать и обмениваться.
(no subject)
12/2/07 19:53 (UTC)