在Scala等语言中,通过更改参数的数量和/或方法的参数类型,可以为一个方法名称定义多个定义.这称为方法重载.
这与多次派遣有什么不同?
谢谢
我试图绕过功能依赖,但我自己并没有得到任何结果.在"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.我只是不明白这意味着什么.它是如何确定的?任何人最初都可以用最少的理论解决问题,然后将更重的理论内容联系起来吗?
谢谢
我正在学习使用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) 我有一个必须从N到0(包括)的循环.我的i变量的类型size_t通常是无符号的.我目前正在使用以下代码:
for (size_t i = N; i != (size_t) -1; --i) {
...
}
Run Code Online (Sandbox Code Playgroud)
那是对的吗?有没有更好的方法来处理这种情况?
谢谢,
文森特.
在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)
有什么理由不适用吗?
谢谢,
文森特.
在sqrt大多数语言的功能中(虽然这里我最感兴趣的是C和Haskell),是否有任何保证完美正方形的平方根将被准确返回?例如,如果我这样做sqrt(81.0) == 9.0,那是安全还是有机会sqrt返回8.999999998或9.00000003?
如果无法保证数值精度,那么检查数字是否为完美正方形的首选方法是什么?取平方根,拿地板和天花板,确保它们回到原始数字?
谢谢!
在解决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中编写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中规定的规则
当您查看语言的EBNF描述时,您经常会看到整数和实数的定义:
integer ::= digit digit* // Accepts numbers with a 0 prefix
real ::= integer "." integer (('e'|'E') integer)?
Run Code Online (Sandbox Code Playgroud)
(定义是在飞行中做出的,我可能在它们中犯了一个错误).
虽然它们出现在无上下文语法中,但数字通常在词法分析阶段被识别.它们是否包含在语言定义中以使其更加完整,是否应由实施者意识到它们实际上应该在扫描仪中?
使用Emscripten编译C程序时,会生成一个HTML页面,用于显示程序的结果.我想知道如何将命令行参数传递给应用程序.例如,使用原始的C程序./bfs 32 1.
使用以下链接列表定义:
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) 我正在慢慢地试图解决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(a从s数据结构中获取).
任何人都可以确认幻灯片中是否有错误,或者如果我的理解不正确,请解释.
谢谢.
我正在为一个类编写一个编译器,而且我坚持使用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并运行生成的程序会给我一个分段错误.谁能告诉我如何正确地进行通话?
谢谢.
文森特.