Яка різниця між, можливо, і в Haskell?


Відповідь 1:

Це чудове запитання! Обидва типи схожі з точки зору, що обидва типи, "Можливо" та "Будь-яке", можна використовувати для перенесення контексту відмови (тобто, можливо, у вас просто число або у вас нічого немає). Також обидва типи підтримують параметри типу і, в цьому сенсі, є абстрактними типами даних, які можна "спеціалізувати", передавши їм параметр типу (можливо Int, або Int String тощо).

Однак їх використання дещо відрізняється. Можливо, може нести лише ідею невдачі, але вона не має достатньої гнучкості, щоб розповісти про те, як стався збій. Наприклад, "Int" може сказати вам, що результат математичної операції є "Просто 5" або "Ніщо", але нічого не може сказати вам про те, що Ніщо не означає результат ділення на нуль (або будь-який інший інший) причина).

Або, з іншого боку, це сума суми, параметризована двома типами. У своєму типовому використанні лівий може використовуватися для перенесення контексту, тоді як правий несе результат. Наприклад, якби ви використовували або для представлення того самого результату математичної операції, ви могли б сконструювати тип "або струна Int". В результаті цієї ж операції ви отримаєте Право 5 (отримане число) або Вліво "Ділення на нуль" (контекст відмови).

Без типу Either ви змушені будете зберігати цей додатковий біт інформації (причину відмови) в іншому місці, що робить ваші програми менш читабельними, а також вимагатиме передати додатковий параметр вашим функціям та повернути пари результати (результат та контекстна причина відмови).


Відповідь 2:

"Можливо" може мати значення "Нічого" або "Просто х", наприклад, ви отримуєте "річ" або "нічого". Це схоже на нульове значення в іншій мові.

`Будь-який` може мати значення` Лівий х` або `Правий у`, де` x` і `y` можуть мати різні типи. Це часто використовується для розміщення помилок зліва та очікуваних результатів справа. Оскільки помилки, як правило, мають тип помилок (або, можливо, String), і очікувані результати часто мають абсолютно різні типи, тип даних `Either` може містити речі двох різних типів. Це схоже на "об'єднання" в деяких мовах або на схему повернення "даних, помилок" в таких мовах, як Go або NodeJS.