在Scala中,代数数据类型被编码为sealed一级类型层次结构.例:
-- Haskell
data Positioning a = Append
| AppendIf (a -> Bool)
| Explicit ([a] -> [a])
Run Code Online (Sandbox Code Playgroud)
// Scala
sealed trait Positioning[A]
case object Append extends Positioning[Nothing]
case class AppendIf[A](condition: A => Boolean) extends Positioning[A]
case class Explicit[A](f: Seq[A] => Seq[A]) extends Positioning[A]
Run Code Online (Sandbox Code Playgroud)
随着case classES和case objectS,斯卡拉产生了一堆东西一样equals,hashCode,unapply(通过模式匹配使用)等这使我们的许多关键特性和传统的ADT功能.
但是有一个关键的区别 - 在Scala中,"数据构造函数"有自己的类型.比较以下两个例子(从相应的REPL复制).
// Scala
scala> :t Append
Append.type
scala> :t AppendIf[Int](Function const true)
AppendIf[Int]
-- Haskell
haskell> :t Append …Run Code Online (Sandbox Code Playgroud) 家伙.我正试图找到一个问题最优雅的解决方案,并想知道python是否内置了我正在尝试做的事情.
我正在做的是这个.我有一个列表,A我有一个函数f,它接受一个项目并返回一个列表.我可以使用列表理解来转换所有内容A;
[f(a) for a in A]
Run Code Online (Sandbox Code Playgroud)
但这会返回列表清单;
[a1,a2,a3] => [[b11,b12],[b21,b22],[b31,b32]]
Run Code Online (Sandbox Code Playgroud)
我真正想要的是得到扁平化的清单;
[b11,b12,b21,b22,b31,b32]
Run Code Online (Sandbox Code Playgroud)
现在,其他语言都有它; 它传统上称为flatmap函数式编程语言,而.Net称之为SelectMany.python有类似的东西吗?有没有一种巧妙的方法来映射列表上的函数并使结果变平?
我试图解决的实际问题是这个; 从目录列表开始,找到所有子目录.所以;
import os
dirs = ["c:\\usr", "c:\\temp"]
subs = [os.listdir(d) for d in dirs]
print subs
Run Code Online (Sandbox Code Playgroud)
currentliy给了我一个列表列表,但我真的想要一个列表.
我最近开始学习scala,并且我遇到了::(cons)函数,它在一个列表前面.
在"Scala编程"一书中,它指出没有附加函数,因为附加到列表具有性能o(n)而前置函数具有o(1)的性能
有些事情让我觉得这个说法错了.
性能是否依赖于实现?是不是可以简单地使用前向和后向链接实现列表并将第一个和最后一个元素存储在容器中?
我想的第二个问题是,当我有一个列表时,我应该做什么,比如说1,2,3,我想在它的末尾添加4个?
我最近一直在对反应式编程进行一些研究,我发现很难找到Reactive和Functional -Reactive 之间差异的良好描述.
是否只是使用功能方法/范例实现反应式编程而不是使用声明式或OO范式?
paradigms programming-languages functional-programming reactive-programming
如何在Objective-C中编写lambda方法?
继续观念:有没有可证明的现实世界语言?
我不了解你,但我厌倦了编写我无法保证的代码.
在询问了上述问题并得到了非凡的回应之后(谢谢大家!)我决定缩小我对Haskell的可证明,实用的方法的搜索范围.我选择哈斯克尔,因为它是真正有用的(也有许多 网页 框架为它写在纸上,这似乎是一个很好的基准)和我认为这是不够严格,在功能上,它可证明的,或者至少允许不变量的测试.
这就是我想要的(并且一直无法找到)
我想要一个可以查看Haskell函数的框架,添加,用psudocode编写:
add(a, b):
return a + b
Run Code Online (Sandbox Code Playgroud)
- 并检查某些常量是否保持每个执行状态.我更喜欢一些正式的证据,但是我会满足于像模特检查员这样的东西.
在此示例中,不变量将是给定值a和b,返回值始终是总和a + b.
这是一个简单的例子,但我不认为这样的框架不可能存在.对于可以测试的函数的复杂性肯定会有一个上限(函数的10个字符串输入肯定会花费很长时间!)但这会鼓励更仔细地设计函数,并且与使用其他正式函数没有什么不同方法.想象一下,使用Z或B,当您定义变量/集时,您可以确保为变量提供尽可能小的范围.如果您的INT永远不会超过100,请确保将其初始化为!像这样的技术和正确的问题分解应该 - 我认为 - 允许对像Haskell这样的纯函数语言进行令人满意的检查.
我还没有 - 使用正式方法或Haskell非常有经验.让我知道我的想法是否合理,或者你认为haskell不合适?如果您建议使用其他语言,请确保通过"has-a-web-framework"测试,并阅读原始问题 :-)
testing haskell formal-verification formal-methods functional-programming
我知道在某些语言(Haskell?)中,努力是实现无点样式,或者永远不要通过名称显式引用函数参数.这对我来说是一个非常难以掌握的概念,但它可以帮助我理解这种风格的优点(或者甚至是缺点).谁能解释一下?
有人可以向我解释依赖打字吗?我在Haskell,Cayenne,Epigram或其他函数式语言方面经验不足,因此您可以使用的术语越简单,我就越感激它!
假设我有一个包含大量项目的列表.
l = [ 1, 4, 6, 30, 2, ... ]
Run Code Online (Sandbox Code Playgroud)
我想从该列表中获取项目数,其中项目应满足特定条件.我的第一个想法是:
count = len([i for i in l if my_condition(l)])
Run Code Online (Sandbox Code Playgroud)
但是如果my_condition()过滤列表也有很多项,我认为为过滤结果创建新列表只是浪费内存.为了效率,恕我直言,以上呼叫不能比:
count = 0
for i in l:
if my_condition(l):
count += 1
Run Code Online (Sandbox Code Playgroud)
有没有任何功能风格的方法来获得满足特定条件的项目#而不生成临时列表?
提前致谢.