Будущая идея в програмирование

stm6692945

Как известно все на данный момент языки работают только
со значениями true и false
Но мой взгляд это не достаточно и необходимо добавить новый тип: unsure (неуверен)
Это станет принуипиально новый подход в програмирование . Вот.

Maurog

уже используют давно
fefs.h:

#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef MAYBE
#define MAYBE 2
#endif

typedef unsigned char FXbool;

alfadred

Maybe Bool :)

margadon

true/false/hz лучше
если будут спрашивать официальные лица, hz означает hesitation zone, но мы-то будем знать :)

agent007new

Это станет принуипиально новый подход в програмирование
Да такая хрень уже в бусте миллион лет живет:
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
}

durka82

А разве нет языков, которые сделаны под нечёткую логику?
А так даже троичные ЭВМ в МГУ когда-то работали :)

procenkotanya

Вы будете смеяться, но логические величины в VHDL могут принимать одно из девяти разных значений, определённых в стандарте IEEE 1164.

yroslavasako

Maybe Bool :)
вот это самый правильный подход.
А по сабжу ещё есть неопределённые поля в БД

Serab

А мне неопределенные операторы и конструкции языка!

yroslavasako

undefined чтоли?

Maurog

вот это самый правильный подход.
А по сабжу ещё есть неопределённые поля в БД
вообще-то это не по сабжу.
вы путаете optional и bool с тремя значениями :shocked:

zorin29

ну это философский вопрос: являются ли два типа T1 и T2 разными, если [math]$|T1| = |T2| < \infty$[/math]

Serab

Тип — это же не только количество значений, еще и возможные операции над ним.
Вообще логично, чтобы tribool можно было тоже сделать optional.

Maurog

боюсь даже спросить что такое [math]$|T1|$[/math]
возможно, это некая метрика на пространстве типов ? :grin:

yroslavasako

Вообще логично, чтобы tribool можно было тоже сделать optional.
MaybeT Maybe Bool

yroslavasako

боюсь даже спросить что такое [math]$|T1|$[/math]
возможно, это некая метрика на пространстве типов ? :grin:
Это мощность множества значений, ватсон

Serab

что ты отвечаешь на мои сообщения английскими словами?

Maurog

Это мощность множества значений, ватсон
спасибо, что без терминаторов ;-)

zorin29

Ну черт, так же лучше звучит, чем "мощности множеств значений совпадают и конечны" :)
Мне казалось, что я выразился достаточно ясно.
2:
"И ты прав." :) Все зависит от того, на каком уровне абстракции мы находимся. Если мы пишем в машинных кодах, то там и операций не так-то много, да и типов раз-два и обчелся, а все остальное - от лукавого / для удобства написания.

yroslavasako

что ты отвечаешь на мои сообщения английскими словами?
эти слова из языка Haskell. Я же не виноват, что он так напоминает английский.

Serab

В этом не виноват, конечно. Но пояснить можно было.

Andbar

А мне неопределенные операторы и конструкции языка!
namespace std {
namespace tr2 {
templace<class C>
С& operator UB(C&) throw(::std::UB) {
//...
}
}
}

Serab

Это не скомпилится (тип у оператора преобразования указан но намек я понял :)

Andbar

Это не скомпилится
естественно. Надо вместо букв UB придумать написание оператора, например - ?.
Зато любой индуский код можно будет написать обобщённо:
#include <iostream>
using namespace std;
using namespace std::tr2;

int main {
cout << ? cin;
}

Serab

А, значит не понял.
Просто у тебя одноначный намек на то, что есть тип std::UB и я понял это как оператор преобразования. А так как есть throw, то там есть некий простор для собственно UB.

Andbar

std::UB - просто исключение, которое может выкинуться при выполнении оператора

Serab

я уж понял, просто совпадение имени оператора и исключения ввело в заблуждение меня.

Maurog

я уж понял, просто совпадение имени оператора и исключения ввело в заблуждение меня.
неудивительно, ведь это UB :grin:

yroslavasako

Много строчек. В хаскеле всё проще - undefined, как я уже писал.
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: Как раскрасить код?

rosali

boost::logic::tribool b = some_operation;
if (b) {
// b is true
}
else if (!b) {
// b is false
}
else {
// b is indeterminate
}

чем то напоминает классику, да? :D

bool CheckFlag(bool flag)
{
if (flag == true)
{
return true;
}
else if (flag == false)
{
return false;
}
else
{
return (!true) && (!false);
}
}
Оставить комментарий
Имя или ник:
Комментарий: