对于像ML系列那样的函数式语言,这是一个关于静态类型系统的软问题.我理解为什么你需要数据类型来描述像列表和树这样的数据结构,但是像数据类型中的命题逻辑那样定义"表达式"似乎带来了一些便利并且不是必需的.例如
datatype arithmetic_exp = Constant of int
| Neg of arithmetic_exp
| Add of (arithmetic_exp * arithmetic_exp)
| Mult of (arithmetic_exp * arithmetic_exp)
Run Code Online (Sandbox Code Playgroud)
定义一组值,您可以在其上编写一个eval
可以为您提供结果的函数.你也可以同样定义了4个功能:const: int -> int
,neg: int -> int
,add: int * int -> int
和mult: int * int -> int
,然后排序的表达add (mult (const 3, neg 2), neg 4)
会给你同样的事情,不带静电安全的任何损失.唯一的复杂因素是你必须做四件事而不是两件事.在学习SML和Haskell时,我一直在考虑哪些功能为您提供了必要的东西,哪些只是一种便利,所以这就是我要问的原因.我想如果你想要从值本身分离一个值的过程,这就很重要,但我不确定哪个有用.
非常感谢.
我知道字符串对象不是空终止但为什么这应该工作?
std::string S("Hey");
for(int i = 0; S[i] != '\0'; ++i)
std::cout << S[i];
Run Code Online (Sandbox Code Playgroud)
所以构造函数也复制了null终止符,但是不增加长度?为什么这么麻烦?
我一直在努力了解monad,因为我最近了解拉链是什么,我认为我可能会尝试将两种想法结合起来.(>> =)做我认为monad应该做的事情,即它让我以拉链的形式组合运动,moveRight >>= moveLeft >>= goAhead >>= return
但我觉得我错过了一些东西,因为,除其他外,我似乎不适合它的类型一个单子应该是什么,即Ma -> (a -> Mb) -> Mb
.欢迎任何帮助.
module MonadZipper where
import Prelude hiding (return, (>>=))
data Node a = Fork a (Node a) (Node a)
| Passage a (Node a)
| DeadEnd a
deriving (Show)
data Branch a = TurnLeft a (Node a)
| TurnRight a (Node a)
| StraightAhead a
deriving (Show)
type Trace a = [Branch a]
type Zipper a = (Trace a, Node a)
type Movement …
Run Code Online (Sandbox Code Playgroud) 我一直在学习链表和节点结构的递归定义一直困扰着我
struct node {
struct node *next;
int data;
};
Run Code Online (Sandbox Code Playgroud)
我想我总是想象自从键入指针后,它会在声明时知道起始地址和它在解除引用时可以访问的内存量.但它不可能,因为它是在任意数量的其他变量之前声明的,这些变量可以构成任何大小的结构.它是仅在取消引用时才弄明白,还是某种内存表在结构定义的末尾和指针可以使用之前被填充?