小编Rob*_*ond的帖子

构造状态对象是否应使用效果类型建模?

当使用像Scala和的功能环境时cats-effect,是否应该使用效果类型来建模有状态对象的构造?

// not a value/case class
class Service(s: name)

def withoutEffect(name: String): Service =
  new Service(name)

def withEffect[F: Sync](name: String): F[Service] =
  F.delay {
    new Service(name)
  }
Run Code Online (Sandbox Code Playgroud)

构造不是容易犯错的,因此我们可以使用较弱的typeclass,例如Apply

// never throws
def withWeakEffect[F: Applicative](name: String): F[Service] =
  new Service(name).pure[F]
Run Code Online (Sandbox Code Playgroud)

我想所有这些都是纯粹的和确定性的。只是不是参照透明的,因为每次生成的实例都是不同的。那是使用效果类型的好时机吗?还是这里会有不同的功能模式?

functional-programming scala scala-cats cats-effect

8
推荐指数
1
解决办法
224
查看次数

在涉及线和地图的情况下对所有权感到困惑

fn problem() -> Vec<&'static str> {
    let my_string = String::from("First Line\nSecond Line");
    my_string.lines().collect()
}
Run Code Online (Sandbox Code Playgroud)

这失败并出现编译错误:

  |
7 |     my_string.lines().collect()
  |     ---------^^^^^^^^^^^^^^^^^^
  |     |
  |     returns a value referencing data owned by the current function
  |     `my_string` is borrowed here
Run Code Online (Sandbox Code Playgroud)

我明白这个错误意味着什么 - 它是为了阻止你返回对超出范围的值的引用。查看所涉及函数的类型签名后,问题似乎出在lines方法上,该方法借用了调用它的字符串。但这有什么关系呢?我正在遍历字符串的行以获取部件的向量,我返回的是这个“新”向量,而不是任何会(非法)直接引用my_string.

(我知道我可以很容易地通过使用字符串文字而不是转换为“拥有”的字符串来修复这个特定的例子String::from。这是一个重现问题的玩具示例——在我的“真实”代码中,字符串变量是从文件中读取,所以我显然不能使用文字。)

对我来说更神秘的是,对我来说应该遇到同样问题的函数的以下变化可以正常工作:

fn this_is_ok() -> Vec<i32> {
    let my_string = String::from("1\n2\n3\n4");
    my_string.lines().map(|n| n.parse().unwrap()).collect()
}
Run Code Online (Sandbox Code Playgroud)

原因不能map做一些魔术,因为这也失败了:

fn also_fails() -> Vec<&'static str> {
    let my_string = String::from("First Line\nSecond Line");
    my_string.lines().map(|s| s).collect()
} …
Run Code Online (Sandbox Code Playgroud)

ownership rust

3
推荐指数
1
解决办法
83
查看次数