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 路径 的内容 记录验证消息

将其拆分为两个独立的函数。在我下面的示例中,我将其称为 findPathvalidatePath,它们通常适用于所有路径。我已经将 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)