相关疑难解决方法(0)

一起使用列表元素和索引

我总是觉得有一个函数或表达式需要在Haskell中使用列表(或数组,应用相同)的值以及索引,这很难.

validQueens在这里尝试N皇后问题时写下 ......

validQueens x = 
     and [abs (x!!i - x!!j) /= j-i | i<-[0..length x - 2], j<-[i+1..length x - 1]]
Run Code Online (Sandbox Code Playgroud)

我不关心使用索引,所有的加号和减号等.它感觉马虎.我想出了以下内容:

enumerate x = zip [0..length x - 1] x

validQueens' :: [Int] -> Bool
validQueens' x = and [abs (snd j - snd i) /= fst j - fst i | i<-l, j<-l, fst j > fst i]
                   where l = enumerate x 
Run Code Online (Sandbox Code Playgroud)

受到Python的启发enumerate(不是借用命令式概念必然是一个好主意).似乎在概念好,但sndfst所有的地方还挺吮吸.至少乍一看,它在时间和空间上都是昂贵的.我不确定我是否更喜欢它.

简而言之,我对这两者都不满意

  1. 通过由长度限制的索引进行迭代,或者甚至更糟,逐个和两个
  2. 索引元素元组

有没有人发现他们发现比上述任何一种更优雅的模式?如果没有,是否有任何令人信服的理由,上述方法之一是优越的?

arrays haskell list indices

12
推荐指数
2
解决办法
8218
查看次数

对调用者看起来纯粹但在内部使用突变的函数

我刚收到了专家F#2.0的副本并且发现了这个声明,这有点让我感到惊讶:

例如,在必要时,您可以对算法开头分配的私有数据结构使用副作用,然后在返回结果之前丢弃这些数据结构; 总体结果实际上是一种无副作用的功能.从F#库中分离的一个例子是List.map的库实现,它在内部使用变异; 写入发生在内部分离的数据结构上,其他代码无法访问.

现在,显然这种方法的优点是性能.我只是好奇是否有任何缺点 - 副作用带来的任何陷阱都适用于此吗?并行性是否受到影响?

换句话说,如果放弃表现,那么List.map以纯粹的方式实施会更好吗?

(显然这特别涉及F#,但我也对一般哲学感到好奇)

monads f# haskell functional-programming side-effects

8
推荐指数
3
解决办法
1343
查看次数