小编Pen*_*ino的帖子

在SICP中使用lambda进行cons/car/cdr定义

当我在SICP中遇到以下'替代'定义的缺点和汽车时,我才开始觉得我对球拍和方案中lambda的使用有一个模糊的理解

(define (cons x y)
   (lambda (m) (m x y)))

(define (car z)
  (z (lambda (p q) p)))

(define (cdr z)
  (z (lambda (p q) q)))
Run Code Online (Sandbox Code Playgroud)

对于我的生活,我无法解析它们.

任何人都能解释如何以对全新手有意义的方式解析或扩展这些吗?

lambda scheme sicp racket

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

Haskell 类型构造函数“只是”一个函数吗?

我正在阅读“从第一原则开始的 Haskell 编程”,并找到了一个练习,询问以下 [此处稍微编辑的代码] 是否有效:

module Test where

type Subject = String
type Verb = String
type Object = String

data Sentence = 
  Sentence Subject Verb Object
  deriving (Eq, Show)

a1 = Sentence "I" "like" "cheese"
a2 = Sentence "I" "scream"
Run Code Online (Sandbox Code Playgroud)

我最初的期望是代码会失败,因为在 的定义中a2Sentence只有两个参数。但是发现GHCi很乐意加载模块。我做了一些实验,发现我现在可以打字了

a3 = a2 "icecream"
Run Code Online (Sandbox Code Playgroud)

并且a3(输入到 GHCi 中)将打印Sentence "I" "scream" "icecream". 另外,如果我查询a2我得到的类型a2 :: Object -> Sentence。所以如果我理解正确的话,a2它的行为就像一个部分应用的函数。

因此,问题是:在所有情况下,类型构造函数是否真的只是一个函数(返回类型值)——与“普通”函数的区别仅在于它必须以大写字符开头?

haskell types function algebraic-data-types custom-data-type

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

在MASM32中混淆括号

我试图掌握MASM32,并对以下内容感到困惑:

我认为括号用于间接,所以如果我有一个预定义的变量

 .data
   item dd 42
Run Code Online (Sandbox Code Playgroud)

然后

 mov ebx, item
Run Code Online (Sandbox Code Playgroud)

将'item'的内容,即数字42,放入ebx和

 mov ebx, [item]
Run Code Online (Sandbox Code Playgroud)

将'item'的地址,即存储42的地址放入ebx.

但是控制台应用程序中的以下代码:

 mov ebx, item
 invoke dwtoa, ebx, ADDR valuestr 
 invoke StdOut, ADDR valuestr
 mov ebx, [item]
 invoke dwtoa, ebx, ADDR valuestr 
 invoke StdOut, ADDR valuestr
Run Code Online (Sandbox Code Playgroud)

两次打印42次.要获得"项目"的地址,我似乎需要

 mov ebx, [OFFSET item]
 invoke dwtoa, ebx, ADDR valuestr 
 invoke StdOut, ADDR valuestr
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释MASM中的方括号,或者指出一个很好的参考.

assembly masm masm32

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

Big-O用于编译器

有没有人能够深入了解编译器的典型大O复杂性?

我知道它必须是>= n(其中n是程序中的行数),因为它需要至少扫描每行一次.

我相信它也必须>= n.logn是一个过程语言,因为程序可以引入O(n)变量,函数,过程和类型等,当在程序中引用它们时,需要O(log n)查找每个参考.

除此之外,我对编译器体系结构的非正式理解已达到极限,我不确定前向声明,递归,函数语言和/或其他技巧是否会增加编译器的算法复杂性.

所以,总结一下:

  1. 对于"典型的"过程语言(C,pascal,C#等),有效设计的编译器存在限制性大O(作为行数的度量)

  2. 对于"典型"的函数式语言(lisp,Haskell等),有效设计的编译器存在限制性大O(作为行数的度量)

compiler-construction algorithm

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

在Haskell中强制数据类型时,代码格式简洁

作为Haskell的原始初学者,我试图在ghc编译器中使用-Wall选项时,不加警告地编译所有练习代码。我也试图理解'$'和'。'的使用。避免过多的括号。

在下面的代码中

module Helpers (intSqrt1, intSqrt2)  where 

intSqrt1 :: Int -> Int
intSqrt1 x = truncate $ sqrt $ fromIntegral x

intSqrt2 :: Int -> Int
intSqrt2 x = truncate ( sqrt (fromIntegral x) :: Double)
Run Code Online (Sandbox Code Playgroud)

intSqrt1发出警告,将以下约束默认设置为类型'Double'。我可以通过将结果从sqrt强制为Double来抑制警告(请参阅intSqrt2),但是这样做的代价是添加两对括号。

有没有办法在此功能中兼得两全:即简洁的代码和警告的抑制?

haskell

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

被UInt64困惑

下面的代码片段演示了我最近从最近的ISO映像文件重新安装的Delphi XE2中的文本IO和UInt64类型变量的问题 - 编译失败,并显示与缺少Text.ReadUInt64函数或过程相关的错误消息.如果我用更换失败的线路

  ReadLn(F,A);
Run Code Online (Sandbox Code Playgroud)

然后程序编译,正确写入

-1
18446744073709551615
Run Code Online (Sandbox Code Playgroud)

到文本文件,然后(如预期的那样)在第二次读取时失败,出现EInOutError:"无效的数字输入".我是否有损坏的安装或有人写入ReadUInt64函数失败?我可以在帮助中找到的对ReadUInt64的唯一引用是以下定义:

function ReadUInt64: UInt64; virtual;
Run Code Online (Sandbox Code Playgroud)

在System.Classes.TBinaryReader.ReadUInt64中.我不确定这是否是"相同"的功能,或者,如果是这样,为什么它是虚拟的......

我也对Help对UInt64的引用感到困惑.它将其定义为:

type UInt64 = Int64;
Run Code Online (Sandbox Code Playgroud)

如果这是正确的,编译器如何知道将UInt64与Int64变量区别对待?

procedure TForm1.Button1Click(Sender: TObject);
var
  F : TextFile;
  A : Int64;
  B : Uint64;
begin
{
Compiler warns on following line with message:
[DCC Warning] Unit1.pas(32): W1012 Constant expression violates subrange bounds
}
  A := $FFFFFFFFFFFFFFFF;
  B := $FFFFFFFFFFFFFFFF;
  AssignFile(F,'test.txt');
  ReWrite(F);
  Writeln(F,A);
  Writeln(F,B);
  CloseFile(F);
  AssignFile(F,'test.txt');
  ReSet(F);
  ReadLn(F,A);
{
Fails to compile on following line with message:
[DCC Fatal Error] Unit1.pas(42): E2158 …
Run Code Online (Sandbox Code Playgroud)

delphi uint64 delphi-xe2

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

仍然对 GHCi 中的“让”感到困惑

我已经阅读了这个问题的答案,但我仍然感到困惑。在 Windows 10 中运行的 GHCi(版本 8.2.1)和 WinGHCi(版本 1.0.6)中,在提示符下键入时,无论是否使用 let,我似乎都能将值绑定到表达式(请参阅以下)。同样,我似乎能够通过let fx = x x* 和fx = x x*定义相同执行的函数

Prelude> x = 3
Prelude> let y = 3
Prelude> x
3
Prelude> y
3
Prelude> x == y
True
Prelude>
Run Code Online (Sandbox Code Playgroud)

那么在 GHCi 中什么时候真正需要let呢?

如果相关,为 GHCi 设置的语言标志(我认为这是默认值,因为我没有弄乱它们)是

base language is: Haskell2010
with the following modifiers:
  -XNoDatatypeContexts
  -XExtendedDefaultRules
  -XNoMonomorphismRestriction
  -XNondecreasingIndentation
Run Code Online (Sandbox Code Playgroud)

haskell

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

与 Haskell 类混淆

我对 Haskell 中的类感到困惑,如下所示。

我可以定义一个接受 Integral 参数的函数,并成功地为它提供一个 Num 参数:

gi :: Integral a => a -> a
gi i = i
gin = gi (3 :: Num a => a)
Run Code Online (Sandbox Code Playgroud)

我可以定义一个接受 Num 参数的函数,并成功地为它提供一个 Integral 参数:

fn :: Num a => a -> a
fn n = n
fni = fn (3 :: Integral a => a)
Run Code Online (Sandbox Code Playgroud)

我可以定义一个 Integral 值并为其分配一个 Num

i :: Integral a => a
i = (3 :: Num a => a)
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试定义一个 Num 值,那么如果我为其分配一个 Integral 值,则会出现解析错误

- this …
Run Code Online (Sandbox Code Playgroud)

haskell

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

Delphi TPrinter和错误217

任何人都可以解释这应该如何工作(在Windows10上运行Delphi XE2)?

在极简主义的应用程序 - 带有两个按钮的表单 - 中包含以下代码:

procedure TForm2.Button1Click(Sender: TObject);
begin
  Printer.BeginDoc;
  Printer.Canvas.TextOut(10,10,'Hello World');
  Printer.EndDoc;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
  MyPrinter : TPrinter;
begin
  MyPrinter := Printer;
  MyPrinter.BeginDoc;
  MyPrinter.Canvas.TextOut(10,10,'Hello World');
  MyPrinter.EndDoc;
  MyPrinter.Free;
end;
Run Code Online (Sandbox Code Playgroud)

如果我单击Button1,程序将在我的默认打印机上打印"Hello World",并在关闭它时正常关闭(使用关闭按钮).如果相反,我点击Button2,程序打印一个相同的页面,但现在当我关闭关闭按钮时,我收到错误217消息.

我无法在Delphi文档中找到有关如何使用Printer函数和TPrinter变量的说明.我很高兴使用Button1技术的派生来打印 - 如果确认这是'防弹'的方法,但想了解为什么Button2方法不起作用.我是否应该假设释放任何我实例化的TPrinter对象不是我的责任,还是有更明确的解释?

printing delphi runtime-error

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