ramda.js 中带有模板字符串的 Pointfree 样式
Pointfree-Style with template-string in ramda.js
我在 ramda.js 中编写 pointfree 风格的函数时遇到问题,想知道是否有人可以帮助我。 getEnv
函数读取环境变量并在找不到时记录到控制台。
这是我的代码
const env = name => R.path(['env', name], process);
const getEnv = name => R.pipe(
env,
R.when(R.isNil, () => log(`Missing env "${name}"`))
)(name);
console.log(getEnv('myenv'))
我想删除 getEnv
函数的 name
参数(如果可能,也删除 env
函数的参数)但不知道该怎么做。
函数 getEnv
做的比它应该做的更多。它实际上 returns 路径 或 的内容 记录验证消息。
将其拆分为两个独立的函数。在我下面的示例中,我将其称为 findPath
和 validatePath
,它们通常适用于所有路径。我已经将 validatePath
包装到另一个名为 validateEnvPath
的函数中,它直接搜索 "env"
要删除 env
,您可以执行以下操作:R.flip (R.curry (R.path))
。这将使函数 curry 然后是参数,因此您可以告诉函数您首先要查询的位置
const process = {env: {myenv: ':)'}}
const path = R.flip(R.curry(R.path))
const findPathInProcess = R.pipe(
path (process),
R.ifElse(
R.isNil,
R.always(undefined),
R.identity
)
)
const validatePath = path =>
validationPathResponse (findPathInProcess( path )) (`can't find something under [${path}]`)
const validateEnvPath = path =>
validatePath (buildPath (['env']) (path))
const buildPath = xs => x =>
xs.concat(x)
const validationPathResponse = response => errorMessage =>
response
? response
: errorMessage
console.log(validatePath(['env', 'myenv']))
console.log(validateEnvPath('myenv'))
console.log(validateEnvPath('yourenv'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
另外还可以这样写
const path = R.flip(R.path) // already curried
const findPathInProcess = R.pipe(
path(process),
R.when(
R.isNil,
R.always(undefined)
)
)
考虑使用 Either
monad。 Sanctuary 是否已经实现并与它的兄弟 ramda:
配合得很好
const viewEnv = S.pipe ([
S.flip (R.append) (['env']),
R.lensPath,
R.view,
S.T (process),
S.toEither ('Given variable could not be retrieved')
])
const log = R.tap (console.log)
const eitherSomeVar = viewEnv ('someVar')
const eitherWhatever = S.bimap (log) (doSomeOtherStuff)
我在 ramda.js 中编写 pointfree 风格的函数时遇到问题,想知道是否有人可以帮助我。 getEnv
函数读取环境变量并在找不到时记录到控制台。
这是我的代码
const env = name => R.path(['env', name], process);
const getEnv = name => R.pipe(
env,
R.when(R.isNil, () => log(`Missing env "${name}"`))
)(name);
console.log(getEnv('myenv'))
我想删除 getEnv
函数的 name
参数(如果可能,也删除 env
函数的参数)但不知道该怎么做。
函数 getEnv
做的比它应该做的更多。它实际上 returns 路径 或 的内容 记录验证消息。
将其拆分为两个独立的函数。在我下面的示例中,我将其称为 findPath
和 validatePath
,它们通常适用于所有路径。我已经将 validatePath
包装到另一个名为 validateEnvPath
的函数中,它直接搜索 "env"
要删除 env
,您可以执行以下操作:R.flip (R.curry (R.path))
。这将使函数 curry 然后是参数,因此您可以告诉函数您首先要查询的位置
const process = {env: {myenv: ':)'}}
const path = R.flip(R.curry(R.path))
const findPathInProcess = R.pipe(
path (process),
R.ifElse(
R.isNil,
R.always(undefined),
R.identity
)
)
const validatePath = path =>
validationPathResponse (findPathInProcess( path )) (`can't find something under [${path}]`)
const validateEnvPath = path =>
validatePath (buildPath (['env']) (path))
const buildPath = xs => x =>
xs.concat(x)
const validationPathResponse = response => errorMessage =>
response
? response
: errorMessage
console.log(validatePath(['env', 'myenv']))
console.log(validateEnvPath('myenv'))
console.log(validateEnvPath('yourenv'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
另外还可以这样写
const path = R.flip(R.path) // already curried
const findPathInProcess = R.pipe(
path(process),
R.when(
R.isNil,
R.always(undefined)
)
)
考虑使用 Either
monad。 Sanctuary 是否已经实现并与它的兄弟 ramda:
const viewEnv = S.pipe ([
S.flip (R.append) (['env']),
R.lensPath,
R.view,
S.T (process),
S.toEither ('Given variable could not be retrieved')
])
const log = R.tap (console.log)
const eitherSomeVar = viewEnv ('someVar')
const eitherWhatever = S.bimap (log) (doSomeOtherStuff)