小编use*_*502的帖子

monad的一般情况是否在java 6中可以表达?

在Java 6中是否可以表达monad的一般情况?注意单词"一般情况" - monad的一般情况可能是不可表达的,尽管monad(即许多特定monad)的许多特定情况是可表达的.

这里的问题是(缺乏)Java中更高级的泛型 ; 但是,我看到样本Haskell代码实际上是使用像/sf/answers/61392551/(即public class Fix<F extends Fix<F>>)这样的方法移植到Java .

当然,非类型安全的实现(如使用Object和downcast)并不有趣.

更新:有两个常见的monad定义:join-fmap和bind-return.虽然它们(数学上)是等价的,但它们可能不等同于一个定义在Java中可表达,而其他定义则不然(但在我看来,非等价是不可能的).所以我的问题涉及两个定义.

底线:是否有人克服了所有障碍并在Java 6中编写了"一般案例"monad?或者,或者,请指出一篇论文或一篇全面的博客文章,或彻底解释为什么不可能.

java generics monads haskell higher-kinded-types

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

是否允许在Base实例上编写Derived实例?

说,代码

    class Derived: public Base {....}

    Base* b_ptr = new( malloc(sizeof(Derived)) ) Base(1);
    b_ptr->f(2);
    Derived* d_ptr = new(b_ptr) Derived(3);
    b_ptr->g(4);
    d_ptr->f(5);
Run Code Online (Sandbox Code Playgroud)

似乎是合理的,LSP也很满意.

我怀疑当Base和Derived是POD时,此代码是标准允许的,否则不允许(因为vtbl ptr被覆盖).我的问题的第一部分是:请指出这种覆盖的准确前提条件.

可能存在其他标准允许的写入方式.

我的问题的第二部分是:还有其他方法吗?他们的确切先决条件是什么?

更新:我不想写这样的代码; 我对这种代码的理论可能性(或不可能)很感兴趣.所以,这是"标准纳粹"问题,不是"我怎么能......"的问题.(我的问题是否已移至其他stackoverflow站点?)

UPDATE2&4:析构函数怎么样?假设此代码的语义是"基础实例(通过衍生实例片段(破坏性地)更新").让我们假设,为简单起见,Base类有一个简单的析构函数.

更新3:对我来说最有趣的是访问途径的有效性b_ptr->g(4)

c++ memory overwrite language-lawyer

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

Haskell或OCaml中的非本地类型推断真的有用吗?

首先,让我们假设本地类型推断是Scala和C#中的类型推断.Scala本地类型推断在此解释:http://www.scala-lang.org/node/127

另外,让我们假设,一个定义,如

     fact 0 = 1
     fact n = n * fact(n-1)
Run Code Online (Sandbox Code Playgroud)

将计为本地类型推断 - 也就是说,这里的类型推断是函数事实的本地.斯卡拉不允许这种类型的推论; 还是让我们把它算作本地的.

那么,问题是,是否有人有一个实际的例子,至少有两个相互递归的函数(或你自行决定的任何其他非局部性)从类型推断中获得一些好处?请不要发布愚蠢的例子,例如:

    odd 0 = false
    odd n = even(n-1)

    even 0 = true
    even n = odd(n-1)
Run Code Online (Sandbox Code Playgroud)

我怀疑在解析中出现了非愚蠢的实际例子.另外,请您解释程序员从非本地类型推断的使用中获得的好处吗?

更新:

我理解任何局部类型推断不足的例子以及对完整类型推理的需要.

  1. 您的Haskell或OCaml示例可能90%正确,因为您只有90%理解术语"非本地类型推断".但是,您必须了解Haskell(或OCaml)类型推断.

  2. 您的示例可能是使用Scala或C#编写的.请指出compliler确实有足够的信息来推断类型,但由于语言规范或由于Scala或C#中类型推断的仅本地性质,无法推断类型.

//再次,随意纠正我的英语.

ocaml haskell type-inference

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

一元减去0x80000000(有符号和无符号)

n3337.pdf草案5.3.1.8规定:

一元运算-符的操作数应具有算术或无范围的枚举类型,结果是其操作数的否定.对整数或枚举操作数执行整体提升.通过从2ⁿ减去其值来计算无符号数量的负数,其中n是提升的操作数中的位数.结果的类型是提升的操作数的类型.

在某些情况下,这就足够了.假设unsigned int是32位宽,那么(-(0x80000000u)) == 0x80000000u,不是吗?

不过,我找不到关于无符号0x80000000上的一元减号的任何内容.此外,C99标准草案n1336.pdf,6.5.3.3似乎没有提及:

一元运算符的结果是其(提升的)操作数的否定.整数提升在操作数上执行,结果具有提升类型.

UPDATE2:我们假设unsigned int是32位宽.所以,问题是:C中的一元减号(有符号和无符号),以及C++中的一元减号(仅限签名)?

UPDATE1:运行时行为和编译时行为(即常量折叠)都很有趣.

(相关:为什么是abs(0x80000000)== 0x80000000?)

c c++ standards unary-operator

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