我正在从learnyouahaskell.com学习Haskell .我无法理解类型构造函数和数据构造函数.例如,我真的不明白这个的区别:
data Car = Car { company :: String
, model :: String
, year :: Int
} deriving (Show)
Run Code Online (Sandbox Code Playgroud)
还有这个:
data Car a b c = Car { company :: a
, model :: b
, year :: c
} deriving (Show)
Run Code Online (Sandbox Code Playgroud)
我知道第一个只是使用一个构造函数(Car)来构建类型的数据Car.我真的不明白第二个.
另外,数据类型如何定义如下:
data Color = Blue | Green | Red
Run Code Online (Sandbox Code Playgroud)
适合所有这些?
据我所知,第三个例子(Color)是一个可以处于三种状态的类型:Blue,Green或Red.但这与我理解前两个例子的方式有冲突:这个类型Car只能处于一种状态Car,它可以构建各种参数吗?如果是这样,第二个例子如何适应?
基本上,我正在寻找一个解释,统一上述三个代码示例/结构.
我最近一直在阅读有关Perl的内容,并且对于Perl如何处理传递给子例程的参数感到有些困惑.
在Python,Java或PHP等语言中,函数定义采用(伪代码)形式:
function myFunc(arg1, arg2) {
// Do something with arg1 and arg2 here
}
Run Code Online (Sandbox Code Playgroud)
然而在Perl中,它只是:
sub mySub {
# @_ holds all arguments passed
}
Run Code Online (Sandbox Code Playgroud)
据我了解,这是唯一的方法.
如果我想限制调用者只传递2个参数怎么办?
这不仅仅是Perl在其他语言(即Python,C等)中不允许任何变量数量参数吗?
在某些时候这不会成为问题吗?
其他语言中的所有默认参数号检查怎么样?是否必须在Perl中明确地做到这一点?例如
sub a_sub {
if (@_ == 2) {
# Continue function
}
else {
return false
}
}
Run Code Online (Sandbox Code Playgroud)我知道头文件有各种函数,结构等的前向声明,在.c'调用'的文件中使用#include,对吗?据我了解,"权力分立"的情况如下:
头文件: func.h
包含函数的前向声明
int func(int i);
Run Code Online (Sandbox Code Playgroud)C源文件: func.c
包含实际的函数定义
#include "func.h"
int func(int i) {
return ++i ;
}
Run Code Online (Sandbox Code Playgroud)C源文件source.c("实际"程序):
#include <stdio.h>
#include "func.h"
int main(void) {
int res = func(3);
printf("%i", res);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:看到它#include只是一个复制文件中的内容的编译器指令,.h文件#include如何.c知道如何实际执行该函数?所有它都是int func(int i);,所以它如何实际执行功能?它如何获得对实际定义的访问func?标题是否包含某种"指针",表示"那是我的定义,那边!"?
它是如何工作的?
因此,有两种方法可以获取列表并将第二个列表的成员添加到第一个列表中.您可以使用列表连接,也可以迭代它.您可以:
for obj in list2:
list1.append(obj)
Run Code Online (Sandbox Code Playgroud)
或者你可以:
list1 = list1 + list2
Run Code Online (Sandbox Code Playgroud)
要么
list1 += list2
Run Code Online (Sandbox Code Playgroud)
我的问题是:哪个更快,为什么?我使用两个非常大的列表(超过10000个对象)对此进行了测试,似乎迭代方法比列表连接快得多(如l1 = l1 + l2).为什么是这样?谁能解释一下?
好的,首先要解决这个问题:我已经阅读了以下答案:
但我真的不明白它的答案.
在像Python这样的语言中,表达式为:
x = a + b
Run Code Online (Sandbox Code Playgroud)
无法真正编译,因为"编译器"不可能知道a和b的类型(因为类型只在运行时知道),因此如何添加它们.
这就是使Python这样的语言在没有类型声明的情况下无法编译的原因,对吗?通过声明,编译器知道例如a和b是整数,因此知道如何添加它们,并将其转换为本机代码.
那怎么做:
(setq x 60)
(setq y 40)
(+ x y)
Run Code Online (Sandbox Code Playgroud)
工作?
编译被定义为本机提前编译.
编辑
实际上,这个问题更多的是关于是否可以编译没有类型声明的动态语言,如果是,如何编译?
编辑2
经过大量研究(即狂热的维基百科浏览),我想我理解以下内容:
如果我在上述任何一点上错了,请纠正我.
所以,二进制只是基数2,对吧?1s和0s.但是,例如,当您从Google转换为bin时,为什么它在实际数字前面还有一个(x)b?例如,0b __是什么意思?
为什么不能完全编译纯Python?编译或解释是实现的特征,而不是语言。那么不应该有一些完全预先编译为本机代码的 Python 实现吗?是什么让(纯)Python 如此难以编译?
我知道有 PyPy 和 Cython 之类的东西,但据我所知,它们不是纯 Python,需要诸如类型注释之类的东西。
谢谢
完全编译的意思是事先编译为本机代码,如 C 或 C++ 或 Lisp。
好的,所以我对Meteor.js的某些事情感到困惑.我用它创建了一个网站来测试各种概念,它运行良好.一旦我删除了"不安全"和"自动发布",我在尝试检索并推送到服务器时会收到多个"拒绝访问"错误.我相信它与以下代码段有关:
Template.posts.posts = function () {
return Posts.find({}, {sort: {time: -1}});
}
Run Code Online (Sandbox Code Playgroud)
我认为它正在尝试直接访问该集合,允许它启用"不安全"和"自动发布",但一旦它们被禁用,它就会被拒绝访问.我认为另一件作品存在问题:
else {
Posts.insert({
user: Meteor.user().profile.name,
post: post.value,
time: Date.now(),
});
Run Code Online (Sandbox Code Playgroud)
我认为同样的事情正在发生:它试图直接访问集合,这是不允许的.
我的问题是,我如何重新考虑它,以便我不需要启用"不安全"和"自动发布"?
谢谢.
编辑
最后:
/**
* Models
*/
Posts = new Meteor.Collection('posts');
posts = Posts
if (Meteor.isClient) {
Meteor.subscribe('posts');
}
if (Meteor.isServer) {
Meteor.publish('posts', function() {
return posts.find({}, {time:-1, limit: 100});
});
posts.allow({
insert: function (document) {
return true;
},
update: function () {
return false;
},
remove: function () {
return false;
}
});
}
Run Code Online (Sandbox Code Playgroud) 如何更改 EasyGUI 中输入框和消息文本的字体设置?我知道您必须在某个地方编辑文件,但仅此而已。确切地如何做到这一点以及编辑什么内容将不胜感激。
提前致谢。
c ×2
python ×2
binary ×1
easygui ×1
haskell ×1
javascript ×1
linker ×1
lisp ×1
math ×1
meteor ×1
notation ×1
performance ×1
perl ×1
profiling ×1
python-3.x ×1