当我在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)
对于我的生活,我无法解析它们.
任何人都能解释如何以对全新手有意义的方式解析或扩展这些吗?
我正在阅读“从第一原则开始的 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)
我最初的期望是代码会失败,因为在 的定义中a2,Sentence只有两个参数。但是发现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
我试图掌握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中的方括号,或者指出一个很好的参考.
有没有人能够深入了解编译器的典型大O复杂性?
我知道它必须是>= n(其中n是程序中的行数),因为它需要至少扫描每行一次.
我相信它也必须>= n.logn是一个过程语言,因为程序可以引入O(n)变量,函数,过程和类型等,当在程序中引用它们时,需要O(log n)查找每个参考.
除此之外,我对编译器体系结构的非正式理解已达到极限,我不确定前向声明,递归,函数语言和/或其他技巧是否会增加编译器的算法复杂性.
所以,总结一下:
对于"典型的"过程语言(C,pascal,C#等),有效设计的编译器存在限制性大O(作为行数的度量)
对于"典型"的函数式语言(lisp,Haskell等),有效设计的编译器存在限制性大O(作为行数的度量)
作为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),但是这样做的代价是添加两对括号。
有没有办法在此功能中兼得两全:即简洁的代码和警告的抑制?
下面的代码片段演示了我最近从最近的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) 我已经阅读了这个问题的答案,但我仍然感到困惑。在 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 中的类感到困惑,如下所示。
我可以定义一个接受 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) 任何人都可以解释这应该如何工作(在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对象不是我的责任,还是有更明确的解释?