小编gnu*_*nce的帖子

多个调度和方法重载有什么区别?

在Scala等语言中,通过更改参数的数量和/或方法的参数类型,可以为一个方法名称定义多个定义.这称为方法重载.

这与多次派遣有什么不同?

谢谢

oop

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

Haskell中的功能依赖

我试图绕过功能依赖,但我自己并没有得到任何结果.在"Monad Transformers Step by Step"一文中,作者给出了这两个类型定义:

class (Monad m) => MonadError e m | m -> e where
    throwError :: e -> m a
    catchError :: m a -> (e -> m a) -> m a

class (Monad m) => MonadReader r m | m -> r where
    ask :: m r
    local :: (r -> r) -> m a -> m a
Run Code Online (Sandbox Code Playgroud)

根据我对在网上发现的一些材料的理解,这意味着类型变量e由确定m.我只是不明白这意味着什么.它是如何确定的?任何人最初都可以用最少的理论解决问题,然后将更重的理论内容联系起来吗?

谢谢

haskell typeclass

22
推荐指数
3
解决办法
2882
查看次数

与Alex和Happy一起管理职位信息

我正在学习使用Alex和Happy编写一个小编译器.我想维护AST节点的行和列信息,以便我可以向用户提供有意义的错误消息.为了说明我打算如何做,我写了一个小例子(见下面的代码),我想知道我是否接近问题的方式(将AlexPosn附加到标记,将多态属性字段附加到AST节点,使用tkPos和astAttr)是好的风格或者是否有更好的方法来处理位置信息.

Lexer.x:

{
module Lexer where
}

%wrapper "posn"

$white = [\ \t\n]

tokens :-

$white+ ;
[xX] { \pos s -> MkToken pos X }
"+"  { \pos s -> MkToken pos Plus }
"*"  { \pos s -> MkToken pos Times }
"("  { \pos s -> MkToken pos LParen }
")"  { \pos s -> MkToken pos RParen }

{
data Token = MkToken AlexPosn TokenClass
           deriving (Show, Eq)

data TokenClass = X
                | Plus
                | Times …
Run Code Online (Sandbox Code Playgroud)

parsing haskell lexical-analysis alex happy

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

对于使用无符号整数时循环条件停止为0?

我有一个必须从N到0(包括)的循环.我的i变量的类型size_t通常是无符号的.我目前正在使用以下代码:

for (size_t i = N; i != (size_t) -1; --i) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

那是对的吗?有没有更好的方法来处理这种情况?

谢谢,

文森特.

c unsigned for-loop

11
推荐指数
3
解决办法
1809
查看次数

为什么没有为不同的返回类型定义方法重载?

在Scala中,您可以通过使用共享公共名称但具有不同arities或不同参数类型的方法来重载方法.我想知道为什么这也没有扩展到方法的返回类型?请考虑以下代码:

class C {
  def m: Int = 42
  def m: String = "forty two"
}

val c = new C
val i: Int = C.m
val s: String = C.m
Run Code Online (Sandbox Code Playgroud)

有什么理由不适用吗?

谢谢,

文森特.

oop methods scala overloading

9
推荐指数
3
解决办法
2901
查看次数

sqrt,完美正方形和浮点错误

sqrt大多数语言的功能中(虽然这里我最感兴趣的是C和Haskell),是否有任何保证完美正方形的平方根将被准确返回?例如,如果我这样做sqrt(81.0) == 9.0,那是安全还是有机会sqrt返回8.999999998或9.00000003?

如果无法保证数值精度,那么检查数字是否为完美正方形的首选方法是什么?取平方根,拿地板和天花板,确保它们回到原始数字?

谢谢!

c floating-point haskell

8
推荐指数
2
解决办法
2991
查看次数

在Haskell中使用动态编程?[警告:ProjectEuler 31解决方案内部]

在解决projecteuler.net的问题#31 [ SPOILERS AHEAD ](计算用英镑硬币赚2英镑的方式)时,我想使用动态编程.我从OCaml开始,编写了简短而有效的编程:

open Num

let make_dyn_table amount coins =
  let t = Array.make_matrix (Array.length coins) (amount+1) (Int 1) in
  for i = 1 to (Array.length t) - 1 do
    for j = 0 to amount do
      if j < coins.(i) then
        t.(i).(j) <- t.(i-1).(j)
      else
        t.(i).(j) <- t.(i-1).(j) +/ t.(i).(j - coins.(i))
    done
  done;
  t

let _ =
  let t = make_dyn_table 200 [|1;2;5;10;20;50;100;200|] in
  let last_row = Array.length t - 1 in
  let last_col = Array.length …
Run Code Online (Sandbox Code Playgroud)

ocaml haskell dynamic-programming

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

如何解决LR(1)语法定义中的歧义?

我在OCaml中编写Golang编译器,参数列表让我有点头疼.在Go中,您可以按以下方式对相同类型的连续参数名称进行分组:

func f(a, b, c int)  ===  func f(a int, b int, c int)
Run Code Online (Sandbox Code Playgroud)

您还可以拥有一个类型列表,不带参数名称:

func g(int, string, int)
Run Code Online (Sandbox Code Playgroud)

这两种风格不能混合搭配; 要么所有参数都被命名,要么都没有.

我的问题是,当解析器看到一个逗号时,它不知道该怎么做.在第一个例子中,是a一个类型的名称或一个变量的名称,有更多的变量出现?逗号有双重角色,我不知道如何解决这个问题.

我正在为OCaml使用Menhir解析器生成器工具.

编辑:目前,我的Menhir语法完全遵循http://golang.org/ref/spec#Function_types中规定的规则

parsing ocaml go

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

数字识别是否属于扫描仪或解析器?

当您查看语言的EBNF描述时,您经常会看到整数和实数的定义:

integer  ::= digit digit*   // Accepts numbers with a 0 prefix
real     ::= integer "." integer (('e'|'E') integer)?
Run Code Online (Sandbox Code Playgroud)

(定义是在飞行中做出的,我可能在它们中犯了一个错误).

虽然它们出现在无上下文语法中,但数字通常在词法分析阶段被识别.它们是否包含在语言定义中以使其更加完整,是否应由实施者意识到它们实际上应该在扫描仪中?

parsing lexical-analysis

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

将命令行参数传递给emscripten生成的应用程序

使用Emscripten编译C程序时,会生成一个HTML页面,用于显示程序的结果.我想知道如何将命令行参数传递给应用程序.例如,使用原始的C程序./bfs 32 1.

javascript emscripten

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

如何用Rust编写合适的map函数?

使用以下链接列表定义:

enum List<T> {
    Nil,
    Cons(T, ~List<T>)
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个map函数(即将操作应用于列表的每个元素并返回一个新列表).我正在尝试使用教程中提供的指南和其他不同的地方(例如Rust for Rubyists),所以我试图在可能的情况下使用值和借用指针而不是拥有指针.这引出了以下函数定义:

fn map<T1, T2>(f: |T1| -> T2, xs: &List<T1>) -> ~List<T2> { ... }
Run Code Online (Sandbox Code Playgroud)

我认为这是有道理的; 变换器函数对值起作用,list参数是借用的指针.我返回一个拥有的指针,因为我需要使用递归调用的返回值来构造一个值.

现在,让我们来看看身体:

fn map<T1, T2>(f: |T1| -> T2, xs: &List<T1>) -> ~List<T2> {
    match xs {
        &Nil => ~Nil,
        &Cons(x, ~ref rest) => ~Cons(f(x), map(f, rest))
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的第一次尝试; 该~ref语法是有点不直观,但我发现它的教程.此实现不编译.

demo.rs:25:15: 25:16 error: cannot bind by-move and by-ref in the same pattern
demo.rs:25         &Cons(x, ~ref rest) => ~Cons(f(x), map(f, rest))
                         ^
demo.rs:25:19: 25:27 …
Run Code Online (Sandbox Code Playgroud)

pointers rust

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

Edward Kmett的演讲中镜头定义不正确?

我正在慢慢地试图解决lens包装的工作原理.我正在阅读Edward的幻灯片(http://comonad.com/haskell/Lenses-Folds-and-Traversals-NYC.pdf),我Store s a对幻灯片8和9 的定义有疑问:

newtype Lens s a = Lens (s -> Store s a)
data Store s a = Store (s -> a) s
Run Code Online (Sandbox Code Playgroud)

定义是否倒退?如果镜头是一对吸气剂和固定剂,在我看来Store s a应该被定义为:

data Store s a = Store (a -> s) a
Run Code Online (Sandbox Code Playgroud)

其中第一个构造函数参数是setter(放置a并返回s数据结构),第二个是getter(as数据结构中获取).

任何人都可以确认幻灯片中是否有错误,或者如果我的理解不正确,请解释.

谢谢.

haskell

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

在汇编程序中进行间接调用

我正在为一个类编写一个编译器,而且我坚持使用GNU的语法进行间接调用.考虑这个简单的程序:

.text
.globl main
main:
  movl func, %eax
  call *%eax
  ret

func:
  movl $42, %eax
  ret
Run Code Online (Sandbox Code Playgroud)

使用gcc -m32 -O0并运行生成的程序会给我一个分段错误.谁能告诉我如何正确地进行通话?

谢谢.

文森特.

compiler-construction x86 assembly

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