如何命名包含在Monad中的变量?

时间:2017-12-19 11:04:41

标签: scala monads

我倾向于使用变量来提高可读性但是当谈到monad时,我提出了我自己的约定,以明确我的变量包含在(可能是堆栈)monad(s)中

def getUser(id: Int): Future[User] = ???

val _user1 = getUser(1)
val _user2 = getUser(2)

for {
  user1 <- _user1
  user2 <- _user2
} yield (user1, user2)

我的一些同事倾向于选择这种语法:

val fUser1 = getUser(1) // makes it clear user is wrapped in a Future

但我相信这可能容易出错:

// getUser now returns an option 
def getUser(id: Int): Option[User]  

val fUser1 = getUser(1) // still compiles but is misleading

// same, if getUser returns a Future[Either[String, User]]
val fUser1 = getUser(1) // fUser1 looks like a Future[User] to me

我认为用_作前缀变量是最差的解决方案,但也不理想......你有解决方案吗?

1 个答案:

答案 0 :(得分:3)

我认为表示您的价值被包装的下划线前缀是非常规的,因此不太可能对其他读者有所帮助。

下划线前缀通常用于表示字段,例如在C#中,请参阅Naming Conventions in C# - underscores

对于期货,使用“f”前缀是Hungarian Notation,并且如果过时则至少被广泛理解。

如果您认为有必要强调类型,我会考虑使用后缀,例如userFuture,否则我只会使用user

如果您认为有必要,您还可以使用类型注释来阐明类型,例如: val user: Future[User] = getUser(1)

你说:

  

但我相信这可能容易出错:

// getUser now returns an option 
def getUser(id: Int): Option[User]  

val fUser1 = getUser(1) // still compiles but is misleading

您将找不到编译器强制执行的命名约定,因此这种关注将适用于您选择的任何命名约定。