Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Заменить код примера #12

Open
stdray opened this issue May 4, 2017 · 6 comments
Open

Заменить код примера #12

stdray opened this issue May 4, 2017 · 6 comments

Comments

@stdray
Copy link

stdray commented May 4, 2017

Предлагаю заменить бесполезный хеллоуворлд на следующий код

type Shape =
    | Circle of radius : float
    | Elipse of radius1 : float * radius2 : float

let shapeArea shape = 
    match shape with
    | Circle(r)      -> System.Math.PI * r ** 2.
    | Elipse(r1, r2) -> System.Math.PI * r1 * r2

let elipse = Elipse(2., 1.)

printfn "%A" (shapeArea elipse)

В отличие от кальки хеллоуворлда C# в этом фрагменте демонстрируется пара основных возможностей F#:

  • алгебраические типы данных
  • сопоставление с образцом

Возможность интеропа со стандартной библиотекой .net продемонстрирована через System.Math.PI.

@FoggyFinder
Copy link
Member

@stdray мне не нравится ваш код, по нескольким причинам

  1. Круг это всего лишь частный случай для эллипса, зачем выносить его отдельным вариантом
  2. Периметр эллипса вычисляется не так

но самая идея здравая 👍

К слову, мне кажется подобные вопросы лучше обсуждать в гиттере - https://gitter.im/fsharplang_ru/Lobby

@stdray
Copy link
Author

stdray commented May 4, 2017

@FoggyFinder поздно. Я уже осознал свою ошибку и удалил коммент. Вернулся к площадям.

@stdray
Copy link
Author

stdray commented May 4, 2017

еще раз изменил код, чтобы никого не будоражить

type Shape =
    | Rectangle of height : float * width : float
    | Elipse of radius1 : float * radius2 : float

let area shape = 
    match shape with
    | Rectangle(h, w) -> h * w
    | Elipse(r1, r2)  -> System.Math.PI * r1 * r2

let elipse = Elipse(2., 1.)

printfn "%A" (area elipse)

@Neftedollar
Copy link
Member

@FoggyFinder мы ув. @stdray из тедеграмм-чатика сюда отправили как раз для того чтоб в чате это не потерялось.

@ForNeVeR
Copy link
Member

ForNeVeR commented May 5, 2017

@FoggyFinder

Круг это всего лишь частный случай для эллипса

В ООП этот вопрос в высшей степени дискуссионный, про него даже есть статья на википедии. Я так понимаю, мотивацией для примера отчасти и было представление этой проблемы с точки зрения F#.

@gsomix
Copy link

gsomix commented May 5, 2017

В качестве альтернативы предлагаю модифицировать данный сниппет. Он покрывает большую часть синтаксиса и решает задачу, похожую на реальную. Заодно хипстеров привлечем. ;)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants