GHC目前实施>>为
(>>) :: m a -> m b -> m b
m >> k = m >>= \_ -> k
Run Code Online (Sandbox Code Playgroud)
为什么不这样做呢?
(>>) :: m a -> m b -> m b
m >> k = m *> k
Run Code Online (Sandbox Code Playgroud)
现在,我在想>>=什么*>都没有.
但是所有的东西都是按语法编写的(如在类型方面),所以很难说明为什么它不起作用.也许monad实例做了一些应用实例没有的计算,但我认为这会破坏该类型的语义.
相关问题在这里/sf/answers/907611071/。
在go中,你可以这样做:
func numsInFactorial(n int) (nums []int) {
// `nums := make([]int)` is not needed
for i := 1; i <= n; i++ {
nums = append(nums, i)
}
return
}
Run Code Online (Sandbox Code Playgroud)
但是,以下方法不起作用:
func mapWithOneKeyAndValue(k int, v int) (m map[int]int) {
m[k] = v
return
}
Run Code Online (Sandbox Code Playgroud)
抛出错误:
panic: assignment to entry in nil map
相反,您必须:
func mapWithOneKeyAndValue(k int, v int) map[int]int {
m := make(map[int]int)
m[k] = v
return
}
Run Code Online (Sandbox Code Playgroud)
我找不到此行为的文档。我已经通读了所有 effective go 的内容,那里也没有提到它。
我知道命名返回值已定义(即内存已分配;接近于分配的new内存)但未初始化(因此make行为未复制)。 …