是否可以在C++中编写不纯的模板?也就是说,模板有时会为相同的模板参数提供不同的结果类型或int.例如,是否有可能Foo<T>在Foo<int>::type有时char和其他时间写一个模板float?或模板Foo<T>,其中Foo<double>::my_static_const_int有时是10和其他20次?
我想通过Haskell FFI在C++中实现一个函数,它应该具有(最终)类型 String -> String.比如说,是否可以在C++中使用完全相同的签名重新实现以下函数?
import Data.Char
toUppers:: String -> String
toUppers s = map toUpper s
Run Code Online (Sandbox Code Playgroud)
特别是,我想避免在返回类型中使用IO,因为在这个简单的任务中引入杂质(我的意思是IO monad)在逻辑上是不必要的.到目前为止我所看到的所有涉及C字符串的例子都涉及返回IO某事或Ptr,它们无法转换回纯粹的String.
我之所以这样做,是因为我觉得封送会对FFI造成混乱.也许如果我能解决上面最简单的情况(除了原始类型,如int),那么我可以在C++端做任何我想要的数据解析,这应该很容易.
与我想要在编组到/从字符串之间进行的计算相比,解析的成本可以忽略不计.
提前致谢.
Haskell中的纯函数是否有可能改变变量的局部副本,就像在函数式编程是一个骗局中提到的那样.大卫·诺伦?如果不是这样的原因是什么原因,如果有的话,有没有人能指出我的例子?
类似的问题在函数中被问到,这些函数看起来对调用者来说是纯粹的,但在内部使用变异,并且普遍的共识似乎是纯函数执行变异是可行的,只要突变是在变量的局部副本上执行的(即效果)突变不会逃避功能并具有非局部效应).
问题出现了,当我翻译成沉冒泡排序(局部突变,全球突变,可变数据结构,冒泡齐),这并没有发生变异的名单,以共同Lisp和相比,在冒泡Common Lisp中冒泡,这确实发生变异列表.结果是我发现(在Common Lisp中)对于非常大的列表而言,变异列表的版本明显比没有变异列表的版本快得多.
在D中记忆功能时是否有任何保存纯度的聪明方法?
在缓存保存在RAM中的大型数据集的SHA1计算时,我想要这个.
我知道Haskell函数集只是所有数学函数的一个子集,因为它是一种编程语言,所以它的所有函数都必须是可计算的.但从数学的角度来看,所有Haskell函数(以及一般的纯函数)是否连续都是正确的?
math haskell functional-programming function purely-functional
我对Haskell非常陌生,对语言的"架构"印象深刻,但是我仍然困扰着monad是如何纯粹的.
由于你有任何指令序列,它使它成为一个不纯的函数,尤其是 I/O函数从任何角度来看都不是纯粹的.
是因为Haskell像所有纯函数一样假设IO函数也有返回值,但是以操作码的形式还是什么?我真的很困惑.
在浏览纯函数的定义时,它通常定义为两个特征:
1)在相同输入的情况下应该产生相同的输出
2)不应产生任何副作用
它是否也意味着纯函数不应该是异步的?如果不是,怎么回事?如果是的话,我很乐意在JavaScript中看到异步纯函数的一些例子.
javascript functional-programming purely-functional ecmascript-6
这可能与功能数据结构有关,但我没有找到有关此主题的标签。
假设我有一个语法树类型Tree,它通过简单地共享公共子表达式来组织为 DAG。例如,
data Tree = Val Int | Plus Tree Tree
example :: Tree
example = let x = Val 42 in Plus x x
Run Code Online (Sandbox Code Playgroud)
然后,在这个语法树类型上,我有一个纯函数simplify :: Tree -> Tree,当给定 a 的根节点时,它Tree通过首先简化该根节点的子节点来简化整个树,然后处理根节点本身的操作。
由于simplify是纯函数,并且某些节点是共享的,因此我们希望不会simplify在这些共享节点上多次调用。
问题来了。整个数据结构是不变的,共享对程序员是透明的,因此似乎无法确定两个节点是否实际上是同一个节点。
在处理所谓的“打结”结构时也会出现同样的问题。通过打结,我们为原本无限的数据结构生成了有限的数据表示,例如let xs = 1 : xs in xs。这里xs本身是有限的,但调用map succ它并不一定会产生有限的表示。
这些问题可以归结为:当数据被组织在一个不变的有向图中时,我们如何避免重新访问同一个节点,做重复的工作,甚至在图恰好是循环的时候导致不终止?
我想到的一些想法:
Tree类型扩展为Tree a,使每个节点都拥有一个额外的a. 生成图形时,将每个节点与一个唯一a值相关联。尽管垃圾收集器可能随时移动任何堆对象,但内存地址应该在这里有效。STRef (Maybe Tree)在简化版本的每个节点中存储 …GNU C 和 C++ 提供const和pure函数属性。\n来自gnu 在线文档(重点是我的):
在 GNU C 和 C++ 中,您可以使用函数属性来指定某些函数属性,这些属性可以帮助编译器优化调用或更仔细地检查代码的正确性。例如,您可以使用属性来指定函数从不返回 (noreturn)、仅根据其参数的值返回值 (const)或具有 printf 样式参数 (format)。
\n其中 const 属性似乎是 pure 的子集,也取自gnu 文档:
\n\n\nconst 属性比类似的 pure 属性对函数\xe2\x80\x99s\n定义施加了更大的限制。诊断同时使用 const 和 pure 属性声明相同\n函数。
\n
在 C++ 11 中,添加了constexpr说明符。
当应用于函数时,const 属性和 constexpr 说明符之间有区别吗?GCC 是否应用了不同的优化?
\n一个听起来类似的问题是“constexpr”和“const”之间的差异。但我认为这不是重复的。我的问题具体是关于 function 属性const,它似乎与constexpr.
这实际上是程序员类别理论 -第 2 章中的挑战#6 ,这个问题是我前段时间问过的另一个问题的后续问题:
绘制一个类别的图片,其唯一对象是类型
Void、()(单位)和Bool;箭头对应于这些类型之间所有可能的功能。用函数名称标记箭头。
这是连接这三个对象/类型的箭头/函数列表,我对此更加确定:
Bool -> Booltrue = const True :: () -> Boolfalse = const False :: () -> Boolignore = const () :: Bool -> ()absurd :: Void -> ()absurd :: Void -> Boolid :: () -> ()id :: Void -> Void必须存在,因为我们正在谈论一个类别,对吧?Void其他两个不会发生任何事情,因为它是一个初始对象,对吧?这是正确答案吗?
haskell functional-programming purely-functional category-theory
haskell ×6
c++ ×2
c ×1
caching ×1
constexpr ×1
d ×1
ecmascript-6 ×1
ffi ×1
function ×1
gcc ×1
immutability ×1
javascript ×1
math ×1
memoization ×1
monads ×1
persistence ×1
string ×1
templates ×1