Maybeモナドでしりとり

作ってみました。
最後と最初がつながってなかったり、最後が「ん」の文字列が入力されたらその後の処理はしません。


こちら

#include <iostream>
#include <string>
#include <locale>
#include <shand/maybe.hpp>

using namespace std;
using namespace shand;

inline maybe<wstring>::type last_and_first(const wstring& last)
{
    return monad_return(last);
}

struct next {
    wstring first_;
public:
    typedef maybe<wstring>::type result_type;
    
    next(const wstring& first)
        : first_(first) {}
    
    result_type operator()(const wstring& last) const
    {
        if (is_last_and_first(last, first_))
            return monad_return(first_);

        return nothing();
    }
    
private:
    bool is_last_and_first(const wstring& last, const wstring& first) const
    {
        // 2文字以上ないとしりとりにならない
        if (last.length() < 2 || first.length() < 2)
            return false;

        if (first[first.length() - 1] == L'ん')
            return false;

        return last[last.length() - 1] == first[0];
    }
};

int main()
{
    locale::global(locale("japanese"));
    
    ((last_and_first(L"しりとり") >>= next(L"りす")) >>= next(L"すいか")) >>= next(L"おしまい");
}

ちなみに、Haskellの処理系(GHC)では日本語使うと化けるのでできないのです。。。