2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3
 
 Re: Типы, как наборы функций, удовлетворяющие условиям?
Сообщение11.03.2015, 20:25 


11/12/14
893
arseniiv в сообщении #988902 писал(а):
Так вы же не с одним лиспом сравнивали, а с самим C++!


Ну я и сказал что это примерно как С++ по всяким заковыристостям. По моим внутренним ощущениям, конечно, что тоже сказал.

arseniiv в сообщении #988902 писал(а):
Можно всегда использовать { ; }.


Что и означает что синтаксис сложный - есть куча способов сделать одно и то же в разных выражениях. Программист ессесно должен все способы знать.

arseniiv в сообщении #988902 писал(а):
Может, сравним с APL?


Я сравнивал с С++. APL не знаю.

 Профиль  
                  
 
 Re: Типы, как наборы функций, удовлетворяющие условиям?
Сообщение11.03.2015, 20:29 
Заслуженный участник


27/04/09
28128
aa_dav в сообщении #988905 писал(а):
Ну я и сказал что это примерно как С++ по всяким заковыристостям.
Просто C++ — это язык действительно очень сложный. Не особо понимаю, как можно провести аналогию между ним и хаскелем. :-)

aa_dav в сообщении #988905 писал(а):
Что и означает что синтаксис сложный - есть куча способов сделать одно и то же в разных выражениях. Программист ессесно должен все способы знать.
Ну чего-там знать-то. Раз и запомнил, а если забыл, то легко вспомнил после справочника.

 Профиль  
                  
 
 Re: Типы, как наборы функций, удовлетворяющие условиям?
Сообщение11.03.2015, 20:34 


11/12/14
893
arseniiv в сообщении #988911 писал(а):
Не особо понимаю


Да и не надо на самом деле, у меня нет такой цели чтобы вы чего то поняли.
Оффтоп пошёл неконструктивный.

-- 11.03.2015, 21:35 --

Для топиккастера - я имел ввиду что возможно имеет смысл дочитать SICP, чтобы в "чистом и простом ФП искупаться", а потом уже с этими силами и знаниями наступать на Хаскелль, он внесет много новых концептов.

 Профиль  
                  
 
 Re: Типы, как наборы функций, удовлетворяющие условиям?
Сообщение11.03.2015, 20:40 


05/09/12
2587
arseniiv в сообщении #988867 писал(а):
В любом случае «создать» тип, не используя newtype/data, не получится. Он либо выразим выбранным множеством способов и «уже был» в языке, либо не выразим и его никак туда не добавить, ведь этот тип должен участвовать в типах функций.
А что же тогда у нас с вами получилось на предыдущей странице? Как раз пара и список, гетерогенные причем. Наполняй чем хочешь, в том числе и базовыми уже существующими типами. Но функционал новый - значит именно новый тип, абстрактный - как вы мне тут справедливо написали ранее.

-- 11.03.2015, 20:43 --

aa_dav, спасибо, я после того места перестал читать SICP, пытаясь опробовать эти новые для меня концепции. Но конечно буду продолжать, по мере возможности. И мне бы хотелось продолжения вашего участия в этой и возможно других моих темах.

 Профиль  
                  
 
 Re: Типы, как наборы функций, удовлетворяющие условиям?
Сообщение11.03.2015, 21:06 
Заслуженный участник


27/04/09
28128
aa_dav в сообщении #988914 писал(а):
Оффтоп пошёл неконструктивный.
Согласен.

_Ivana в сообщении #988917 писал(а):
Но функционал новый - значит именно новый тип, абстрактный - как вы мне тут справедливо написали ранее.
Ну, вообще под абстрактным я склонен считать больше то, что упомянуто в статье Unfolding abstract datatypes. :-) Но и тут тип forall c. (a -> b -> c) -> c, соответствующий паре, и т. д., особо новым не назвать. Но это всё слова получаются.

_Ivana в сообщении #988917 писал(а):
Как раз пара и список, гетерогенные причем.
Ну, гетерогенность и у обычных пар (конструируемых (,) вместо cons, мы ведь уже сравнивали их типы) есть.

 Профиль  
                  
 
 Re: Типы, как наборы функций, удовлетворяющие условиям?
Сообщение14.07.2015, 22:49 


05/09/12
2587
Не прошло и полгода, как я навелосипедил примитивный тип, который позволил мне натянуть сову на глобус реализовать на Haskell то, что на Лиспе и Эле реализуется просто и само:
код: [ скачать ] [ спрятать ]
Используется синтаксис Haskell
module FunctionalData where

data FT a = Nil | A a | Fc (String -> FT a)

fromA :: FT a -> a
fromA (A a) = a

--------------   СПИСОК   -----------------

cons :: a -> FT a -> FT a
cons a l = Fc go where
    go "car" = A a
    go "cdr" = l

car :: FT a -> a
car (Fc c) = fromA $ c "car"
car (A x) = x
car _ = error "empty list in ""car"""

cdr :: FT a -> FT a
cdr (Fc c) = c "cdr"
cdr _ = Nil

showLst :: (Show a) => FT a -> String
showLst = ('(':) . tail . go where
    go Nil = ")"
    go l = " " ++ show (car l) ++ go (cdr l)

mapLst :: (a -> b) -> FT a -> FT b
mapLst _ Nil = Nil
mapLst f l   = cons (f . car $ l) (mapLst f $ cdr l)

foldlLst :: (a -> b -> b) -> b -> FT a -> b
foldlLst _ a Nil = a
foldlLst f a l   = foldlLst f (f (car l) a) $ cdr l

foldrLst :: (a -> b -> b) -> b -> FT a -> b
foldrLst _ a Nil = a
foldrLst f a l   = f (car l) $ foldrLst f a $ cdr l

reverseLst :: FT a -> FT a
reverseLst = foldlLst cons Nil

elemLst :: (Eq a) => a -> FT a -> Bool
elemLst e = foldrLst (\x a -> (x==e) || a) False

listFromTo :: (Ord a, Num a) => a -> a -> FT a
listFromTo a b | a > b     = Nil
               | otherwise = cons a $ listFromTo (a+1) b

l :: FT Int
l = listFromTo 1 5

--------------   БИНАРНОЕ ДЕРЕВО   -----------------

makeBT :: a -> FT a -> FT a -> FT a
makeBT a l r = Fc go where
    go "nodeValue" = A a
    go "leftTree" = l
    go "rightTree" = r

nodeBT :: FT a -> a
nodeBT (Fc c) = fromA $ c "nodeValue"
nodeBT (A x) = x
nodeBT _ = error "empty binary tree in ""nodeBT"""

leftBT :: FT a -> FT a
leftBT (Fc c) = c "leftTree"
leftBT _ = Nil

rightBT :: FT a -> FT a
rightBT (Fc c) = c "rightTree"
rightBT _ = Nil

showBT :: (Show a) => FT a -> String
showBT Nil = "-"
showBT t = "(" ++ showBT (leftBT t) ++ " "
    ++ show (nodeBT t) ++ " " ++ showBT (rightBT t) ++ ")"

foldBT :: (a -> b -> b -> b) -> b -> FT a -> b
foldBT f e Nil = e
foldBT f e t = f (nodeBT t) (foldBT f e (leftBT t)) (foldBT f e (rightBT t))

sumBT :: (Num a) => FT a -> a
sumBT = foldBT (\v l r -> v + l + r) 0

depBT :: FT a -> Int
depBT = foldBT (\_ l r -> 1 + max l r) 0

t :: FT Int
t = makeBT 5 (makeBT 2 Nil (makeBT 4 Nil Nil)) (makeBT 10 Nil Nil)

--------------   МНОЖЕСТВО   -----------------

consSet :: (Eq a) => a -> FT a -> FT a
consSet a l = Fc go where
    d = elemLst a l
    go "car" = A $ if d then car l else a
    go "cdr" = if d then cdr l else l

mapSet :: (Eq a, Eq b) => (a -> b) -> FT a -> FT b
mapSet _ Nil = Nil
mapSet f l   = consSet (f . car $ l) (mapSet f $ cdr l)

unionSet :: (Eq a) => FT a -> FT a -> FT a
unionSet a Nil = a
unionSet a b   = unionSet (consSet (car b) a) $ cdr b

s = consSet 1 $ consSet 2 $ consSet 1 Nil

main:: IO ()
main = do
    putStrLn $ "start    list: " ++ showLst l
    putStrLn $ "mapped   list: " ++ (showLst . mapLst (+10) $ l)
    putStrLn $ "reversed list: " ++ (showLst . reverseLst $ l)
    putStrLn $ "sum      list: " ++ show (foldlLst (+) 0 l)

    putStrLn $ "start    set: " ++ showLst l
    putStrLn $ "mapped   set: " ++ (showLst . mapSet (`mod`4) $ l)
    putStrLn $ "union   sets: " ++ (showLst . unionSet l $ listFromTo 1 10)

    putStrLn $ "binary tree: " ++ showBT t
    putStrLn $ "sum    tree: " ++ show (sumBT t)
    putStrLn $ "depth  tree: " ++ show (depBT t)
    putStrLn $ "one type - in same standart homogenic list:"
    print $ zipWith ($) [showLst, showBT] [l, t]
 

Код:
*FunctionalData> :main
start    list: (1 2 3 4 5)
mapped   list: (11 12 13 14 15)
reversed list: (5 4 3 2 1)
sum      list: 15
start    set: (1 2 3 4 5)
mapped   set: (2 3 0 1)
union   sets: (10 9 8 7 6 1 2 3 4 5)
binary tree: ((- 2 (- 4 -)) 5 (- 10 -))
sum    tree: 21
depth  tree: 3
one type - in same standart homogenic list:
["(1 2 3 4 5)","((- 2 (- 4 -)) 5 (- 10 -))"]

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2, 3

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Mihaylo


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group