При создании клиента для веб-API в C # я столкнулся с проблемой, связанной null
со значением, в которой он представлял бы две разные вещи:
- ничего , например,
foo
может иметь или не иметьbar
- неизвестно : по умолчанию ответ API включает только подмножество свойств, вы должны указать, какие дополнительные свойства вы хотите. Таким образом, неизвестно означает, что свойство не было запрошено у API.
После некоторых поисков я узнал о типе Maybe (или Option), о том, как он используется в функциональных языках и как он «решает» проблемы нулевой разыменования, заставляя пользователя задуматься о возможном отсутствии значения. Тем не менее, все ресурсы, с которыми я столкнулся, говорили о замене null на Maybe . Я нашел некоторые упоминания о трехзначной логике , но я не до конца понимаю ее, и в большинстве случаев ее упоминание было в контексте «это плохо».
Теперь мне интересно, имеет ли смысл иметь как концепцию null, так и Maybe , чтобы представлять неизвестное и ничего соответственно. Это трехзначная логика, о которой я читал, или у нее другое имя? Или это намеченный способ вложить «Возможно в»?
M M x
и M x
должны иметь ту же семантику.
Maybe a
то же самое, что , семантически, то же самое, что , и изоморфно типу из ответа @Andej. Для этого типа вы также можете определить свой собственный экземпляр монады и, следовательно, использовать разные комбинаторы монад. + 1 + 1Maybe Maybe a
UserInput a
M (M x)
и M x
должно иметь одинаковую семантику». Возьмем M = List
для примера: списки списков не то же самое, что списки. Когда M
монада, есть преобразование (а именно монада умножение) от M (M x)
к M x
которой объясняет отношения между ними, но они не имеют «такую же семантику».
null
. Это полностью сломанная идея.