2016-08-18 36 views
0

Monadはエラーをうまく処理するために使用されますが、Nothingの後にチェーンのタスクモナドがあると、fork(これはTaskによって提供されていると考えられます)はそこには存在しません。 (falktaleを使用して)以下のコードを参照してください。異なるモナドを処理する際のエラーを処理する方法は?

it.only('handle different monads', done => { 
    const getUserById = id => new Task((reject, result) => setTimeout(
     ()=>result({ userName: 'ron' }) 
     , 0 
    )) 

    const getUser = pipe(
     Maybe.fromNullable, 
     chain(getUserById) 
    ) 

    expect(getUser(null).fork(// complains here: getUser(...).fork is not a function 
     ()=>done(), 
     x=> done('should not be triggered') 
    )) 
}) 

理由は、チェーン(...)は、実際にフォーク機能せず何も返さないであろうNothing.mapを実行しているので、予期しない結果が発生します。

+0

はい、「未使用」を「タスク」に変換する必要があります。 – Bergi

+0

意味があります。しかし、それが何もない場合は、マップ、チェーン、またはその他のものに関係なく、常にNothingを返すようです。 – Ron

+0

はい、Functor/Applicative/Monadメソッドは型変換のために何もしません。あなたは手動で行う必要があります! – Bergi

答えて

0

cata/foldを使用して問題を解決しました。また、falktaleは折り畳みをサポートしていない可能性があるので、ファンタジーオプションを使用する必要があり、自然にオプションを変える必要もあります。以下渡されたユニットテストです:

const Maybe = require('data.maybe') 
const Either = require('data.either') 

const Task = require('data.task') 
const {Some, None} = require('fantasy-options') 
const {fold} = require('pointfree-fantasy') 
const {chain, liftM2} = require('control.monads') 
import {pipe, length, curry, prop, equals, tap} from 'ramda' 
import {expect} from 'chai' 

it.only('handle different monads', done => { 

    const getUserById = id => new Task((reject, result) => setTimeout(
     () => result({ userName: 'ron' }) 
     , 0 
    )) 

    const maybeToOption = m => m.cata({Just: Some, Nothing:()=> None}) 

    const getUser = pipe(
     Maybe.fromNullable, 
     maybeToOption, 
     fold(chain(getUserById),()=>new Task(rej=>rej())) 
    ) 

    expect(getUser(null)['fork'](
     () => done(), 
     x => done('should not be triggered') 
    )) 
}) 

また、ビデオチェック:https://youtu.be/oZ6C9h49bu8を、それが深く全体のことを説明しました。

関連する問題