Будущая идея в програмирование
fefs.h:
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef MAYBE
#define MAYBE 2
#endif
typedef unsigned char FXbool;
Maybe Bool
если будут спрашивать официальные лица, hz означает hesitation zone, но мы-то будем знать
Это станет принуипиально новый подход в програмированиеДа такая хрень уже в бусте миллион лет живет:
First Release
1.32.0
boost::logic::tribool b = some_operation;
if (b) {
// b is true
}
else if (!b) {
// b is false
}
else {
// b is indeterminate
}
А так даже троичные ЭВМ в МГУ когда-то работали
Maybe Boolвот это самый правильный подход.
А по сабжу ещё есть неопределённые поля в БД
А мне неопределенные операторы и конструкции языка!
undefined чтоли?
вот это самый правильный подход.вообще-то это не по сабжу.
А по сабжу ещё есть неопределённые поля в БД
вы путаете optional и bool с тремя значениями
ну это философский вопрос: являются ли два типа T1 и T2 разными, если
Вообще логично, чтобы tribool можно было тоже сделать optional.
возможно, это некая метрика на пространстве типов ?
Вообще логично, чтобы tribool можно было тоже сделать optional.MaybeT Maybe Bool
боюсь даже спросить что такоеЭто мощность множества значений, ватсон
возможно, это некая метрика на пространстве типов ?
что ты отвечаешь на мои сообщения английскими словами?
Это мощность множества значений, ватсонспасибо, что без терминаторов ;-)
Мне казалось, что я выразился достаточно ясно.
2:
"И ты прав." Все зависит от того, на каком уровне абстракции мы находимся. Если мы пишем в машинных кодах, то там и операций не так-то много, да и типов раз-два и обчелся, а все остальное - от лукавого / для удобства написания.
что ты отвечаешь на мои сообщения английскими словами?эти слова из языка Haskell. Я же не виноват, что он так напоминает английский.
В этом не виноват, конечно. Но пояснить можно было.
А мне неопределенные операторы и конструкции языка!
namespace std {
namespace tr2 {
templace<class C>
С& operator UB(C&) throw(::std::UB) {
//...
}
}
}
Это не скомпилится (тип у оператора преобразования указан но намек я понял
Это не скомпилитсяестественно. Надо вместо букв UB придумать написание оператора, например - ?.
Зато любой индуский код можно будет написать обобщённо:
#include <iostream>
using namespace std;
using namespace std::tr2;
int main {
cout << ? cin;
}
Просто у тебя одноначный намек на то, что есть тип std::UB и я понял это как оператор преобразования. А так как есть throw, то там есть некий простор для собственно UB.
std::UB - просто исключение, которое может выкинуться при выполнении оператора
я уж понял, просто совпадение имени оператора и исключения ввело в заблуждение меня.
я уж понял, просто совпадение имени оператора и исключения ввело в заблуждение меня.неудивительно, ведь это UB
MaybeT - монадный трансформер для монады Maybe, придуманный по аналогии с другими трансформерами. По недоразумению (авторы почему-то предполагают, что вносимые в проект изменения должны быть в первую очередь полезны и лишь во вторую забавны) этого трансформера пока не добавили в официальную ветку. На багтрекре предложен такой вариант:
{-# OPTIONS_GHC -fglasgow-exts -fallow-undecidable-instances #-}
module Control.Monad.Maybe
(MaybeT,
runMaybeT,
module Control.Monad,
module Control.Monad.Trans)
where
import Control.Monad
import Control.Monad.Trans
import Control.Monad.State
import Control.Monad.Reader
import Control.Monad.Writer
newtype MaybeT m a = MaybeT {runMaybeT :: m (Maybe a)}
instance Functor m => Functor (MaybeT m) where
fmap f x = MaybeT $ fmap (fmap f) $ runMaybeT x
instance Monad m => Monad (MaybeT m) where
return = MaybeT . return . Just
x >>= f = MaybeT $ runMaybeT x >>= maybe (return Nothing) (runMaybeT . f)
fail _ = MaybeT $ return Nothing
instance Monad m => MonadPlus (MaybeT m) where
mzero = MaybeT $ return Nothing
mplus x y = MaybeT $ do
mx <- runMaybeT x
case mx of
Nothing -> runMaybeT y
Just _ -> return mx
-- Provide other MTL instances, for convenience
instance MonadTrans MaybeT where
lift = MaybeT . liftM Just
-- (Add other MTL instances, and a MonadFix instance)
instance MonadIO m => MonadIO (MaybeT m) where
liftIO = lift . liftIO
instance MonadState s m => MonadState s (MaybeT m) where
get = lift get
put = lift . put
instance MonadReader r m => MonadReader r (MaybeT m) where
ask = lift ask
local f = MaybeT . local f . runMaybeT
instance (Monoid w, MonadWriter w m) => MonadWriter w (MaybeT m) where
tell = lift . tell
listen m = MaybeT (do (mv,w) <- listen (runMaybeT m)
case mv of
Nothing -> return Nothing
Just v -> return (Just (v,w
pass m = MaybeT (do mvf <- runMaybeT m
case mvf of
Nothing -> return Nothing
Just (v,f) -> pass (return (Just v,f
В таком случае можно бесконечно конструировать типы неопределённых значений.
MaybeT (Maybe Bool MaybeT (MaybeT (Maybe Bool ...
ну или
MaybeT (MaybeT (Identity Bool MaybeT (MaybeT (MaybeT (Identity Bool...
Upd: Как раскрасить код?
boost::tribool b = some_operation;
if (b) {
// b is true
}
else if (!b) {
// b is false
}
else {
// b is indeterminate
}
чем то напоминает классику, да?
bool CheckFlag(bool flag)
{
if (flag == true)
{
return true;
}
else if (flag == false)
{
return false;
}
else
{
return (!true) && (!false);
}
}
Оставить комментарий
stm6692945
Как известно все на данный момент языки работают толькосо значениями true и false
Но мой взгляд это не достаточно и необходимо добавить новый тип: unsure (неуверен)
Это станет принуипиально новый подход в програмирование . Вот.