Я пишу реализацию Haskell Maybe Monad в C ++ 11.
Однако я застрял, когда попытался проверить код.Когда я устанавливаю значение типа с помощью псевдо-конструктора Just
, а затем пытаюсь оценить его с помощью функции fromJust
(которая должна просто "распаковать" значение, помещенное в Maybe), программа останавливается и в конечном итоге завершает работу без вывода сообщений.
Итак, я попытался отладить его;Вот вывод для кода testMaybe.cpp:
c1
yeih2
value not null: 0xf16e70
Я добавил пару операторов print, чтобы оценить, где программа останавливается, и кажется, что она останавливается в той точке, где я разыменовываю указатель навернуть значение.(Я пометил это в коде.)
Сначала я подумал, что значение в Maybe может быть деконструировано к тому времени, когда я хочу разыменовать указатель, что, на мой взгляд, приведет к неопределенностиповедение или прекращение.Однако я не смог найти место, где это могло бы произойти.
Не могли бы вы дать мне подсказку, почему это происходит?
testMaybe.cpp:
#include<iostream>
#include "Maybe.hpp"
using namespace std;
using namespace Functional_Maybe;
int main() {
Maybe<string> a{Maybe<string>::Just("hello") };
if(!isNothing(a)) cout << "yeih2 " << fromJust(a) << endl;
return 0;
}
Maybe.hpp
#pragma once
#include<stdexcept>
#include<iostream>
using namespace std;
namespace Functional_Maybe {
template <typename T>
class Maybe {
const T* value;
public:
Maybe(T *v) : value { v } {} //public for return in join
const static Maybe<T> nothing;
static Maybe<T> Just (const T &v) { cout << "c1" << endl; return Maybe<T> { new T(v) }; }
T fromJust() const {
if (isNothing()) throw std::runtime_error("Tried to extract value from Nothing");
cout << "\nvalue not null: " << value << " " << *value << endl;
// ^ stops here
return *value;
}
bool isNothing() const { return value==nullptr; }
~Maybe() { if (value != nullptr) delete value; }
};
template <typename T>
bool isNothing(Maybe<T> val) {
return val.isNothing();
}
template <typename T>
T fromJust(Maybe<T> val) {
return val.fromJust();
}
}