小编Chi*_*ien的帖子

理解 Haskell pure 和 <$> 的问题

在学习了 Applicative 和 Monad 之后,我只是尝试了一些简单的 Haskell 代码,并且对pure和的应用感到困惑<$>。我确实理解这些定义,但在某些特殊情况下,它们似乎有点混淆。

说,我希望得到一个函数foo,它接受 aMaybe Int和 a Maybe [Int],并将第一个参数连接到第二个参数。一个典型的定义可能是:

foo :: Maybe Int -> Maybe [Int] -> Maybe [Int]
foo ma mb = (:) <$> ma <*> mb
Run Code Online (Sandbox Code Playgroud)

这样foo (Just 1) (Just [2])会给Just [1,2].

但是pure在这种情况下似乎没有任何意义,无论我多么努力地使(:)一个应用程序。此外,它的pure (:) (Just 1)工作方式与 do 完全相同(:),但怎么可能呢?我想(:)需要两个参数,所以前一个应该是一个适用的柯里化函数?

非常感谢!

haskell

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

Haskell 列表理解和列表 Monad

我正在尝试编写一些自定义类型Martix a,它基本上是列表列表[[a]]。当我尝试实现一个名为 的函数时colAt,它应该给出矩阵的垂直元素,我首先使用了列表推导式:

colAt :: Int -> Matrix a -> [a]
colAt c m = [ e | r <- m, e <- r !! c ]
Run Code Online (Sandbox Code Playgroud)

但是 Ghci 告诉我

Occurs check: cannot construct the infinite type: a ~ [a]
In the expression: r !! c
Run Code Online (Sandbox Code Playgroud)

虽然 do 符号与

colAt :: Int -> Matrix a -> [a]
colAt c m = do
    r <- m
    return (r !! c)
Run Code Online (Sandbox Code Playgroud)

是什么导致了这个错误?我认为基本上列表理解是列表符号的语法糖,但是鉴于此错误,我的理解是错误的?

monads haskell list-comprehension

3
推荐指数
2
解决办法
90
查看次数

Erlang 列表参数内存使用情况(效率和性能)

我的印象是,在 Erlang 中,当调用函数时,Erlang 会将整个参数从调用者深度复制到被调用者,这主要是由Erlang 效率指南告诉的。然而,我确实注意到指南和原始论文主要关注记录而不是列表。我试图找到一个规范或其他东西来解释 Erlang 如何传递列表参数,但这些努力都是徒劳的。

此时,我的一位同事来找我,告诉我 Erlang “通过引用”传递列表参数,就像 C 指针和 Golang 切片一样,但根据我的经验,这似乎不是真的。由于手头没有可靠的知识,我无法证明我或他的假设。

我想知道是否有这样的文档、论文或规范可以让我学习 Erlang 如何处理列表参数?毫无疑问越官方越好,但实际上即使是博客或电子邮件也可以。

erlang performance

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