【发布时间】:2019-05-18 21:28:51
【问题描述】:
我有以下代码:
import { Task, task } from "fp-ts/lib/Task"
import { Either, left, right } from "fp-ts/lib/Either"
import { curry } from "fp-ts/lib/function"
import { liftA2 } from "fp-ts/lib/Apply"
import { Repo } from "./repo"
const buildPerson = curry((name: string, age: number): Either<Error, any> => {
if (name !== undefined && age !== undefined) {
return right({ name, age })
} else {
return left(Error("Missing parameter"))
}
})
const validatePerson = (person: any): Either<Error, any> => {
if ( person.age < 18) {
return left(Error("Too Young"))
} else {
return right(person)
}
}
const getNameFromRepo = (repo: Repo): Task<string> => {
return new Task(
() => repo.getName()
)
}
const getAgeFromRepo = (repo: Repo): Task<number> => {
return new Task(
() => repo.getAge()
)
}
const savePerson = curry((person:any, repo: Repo): Task<void> => {
return new Task(
() => {
console.log(person)
return repo.setPerson(person)
}
)
})
const hello = async () => {
const repo = new Repo()
await liftA2(task)(buildPerson)(getNameFromRepo(repo))(getAgeFromRepo(repo))
.map(
(e) => e.chain(
(p) => validatePerson(p)
)
)
.map(
(e) => e.fold(
(l) => console.log(l),
(r) => savePerson(r)
)
)
.run()
}
hello()
1) savePerson 函数没有运行,但是返回类型是 Promise
2) Fp-Ts 库表明不推荐使用 liftA2 类型,我应该改用 sequenceT。但是,从签名中不清楚 sequenceT 如何像 liftA2 那样应用于 buildPerson 的参数
3) 有没有更好的方法来组合函数?
【问题讨论】:
-
我喜欢这种类型的编码,但我还没有真正找到一种方法来将它用于一般消费。这是练习编码还是实际使用?
-
您的
(e) => e.fold(l => console.log(l), r => savePerson(r))函数确实返回undefined或Task。该任务永远不会运行,因为您将该函数用作map的回调 - 如果您想链接任务,您需要使用chain。 (并将console.log调用也包含在一个任务中)。
标签: typescript functional-programming fp-ts