假设我有以下记录ADT:
data Foo = Bar { a :: Integer, b :: String, c :: String }
Run Code Online (Sandbox Code Playgroud)
我想要一个记录并返回记录(相同类型)的函数,其中除了一个字段之外的所有字段都具有与作为参数传递的值相同的值,如下所示:
walkDuck x = Bar { a = a x, b = b x, c = lemonadeStand (a x) (b x) }
Run Code Online (Sandbox Code Playgroud)
上面的工作,但对于具有更多字段的记录(比如说10
),创建这样的函数将需要大量的打字,我觉得这是非常不必要的.
是否有任何不那么繁琐的方式做同样的事情?
需要明确的是:我确实知道这一点malloc
并free
在C库中实现,C库通常从操作系统中分配大块内存并进行自己的管理,将较小的内存分配到应用程序并跟踪分配的字节数.这个问题不是免费如何知道免费的多少.
相反,我想知道为什么free
首先这样做.作为一种低级语言,我认为要求C程序员不仅要跟踪分配的内存而且要跟踪多少内容(事实上,我通常发现我最终会跟踪字节数)是完全合理的无论如何都是malloced).在我看来,明确给出字节数free
可能允许一些性能优化,例如,具有不同分配大小的单独池的分配器将能够通过查看输入参数来确定要从哪个池中释放,以及总体而言,空间开销会减少.
因此,简而言之,为什么这些malloc
和free
创造,使得他们必须在内部跟踪的字节数的分配呢?这只是一次历史性事故吗?
一个小编辑:有些人提供了诸如"如果你释放的金额与你分配的金额不同"的分数.我想象的API可能只需要一个就可以完全释放分配的字节数; 释放更多或更少可能只是UB或实现定义.不过,我不想劝阻讨论其他可能性.
在Haskell中,如果我有一个如下所示的lambda
(\x -> doStuff x y)
Run Code Online (Sandbox Code Playgroud)
这里y
是从周围的范围,我可以部分它,把它变成
(`doStuff` y)
Run Code Online (Sandbox Code Playgroud)
这是更短更简洁的(也是我最喜欢的Haskell之一).
现在,在Common Lisp中,我会将等效代码编写为
(lambda (x) (do-stuff x y))
Run Code Online (Sandbox Code Playgroud)
这对我来说实际上是一件很常见的事情,但是我觉得即使是那么一点点样板也让我感到困扰,所以我想知道是否有办法在Common Lisp中获得类似Haskell风格的部分?
我在哪里可以找到这个fromRealFrac
功能?根据温和的介绍功能应该存在,并从谷歌搜索周围,我收集它应该在Prelude - 但ghci抱怨它不在范围内.
我正在fromRational . toRational
暂时使用,因为根据温和的介绍,这是如何fromRealFrac
定义的.
阅读本文我理解你可以使用别名结构(不违反标准),如果它们具有兼容的成员,即给定以下结构:
typedef struct {
uint32_t a;
uint32_t b;
} Frizzly;
Run Code Online (Sandbox Code Playgroud)
以下将破坏别名规则:
uint32_t foo(uint16_t *i) {
Frizzly *f = (Frizzly *)i;
return f->a;
}
Run Code Online (Sandbox Code Playgroud)
但以下不会:
uint32_t foo(uint32_t *i) {
Frizzly *f = (Frizzly *)i;
return f->b;
}
Run Code Online (Sandbox Code Playgroud)
因为所讨论的"聚合类型"包含与我们投入其中的指针兼容的类型,即指向类型的指针uint32_t
可以被转换为包含类型成员(或成员)的结构,uint32_t
而不会破坏别名规则.
首先,我是否理解正确?
其次,结构中(其他)变量的排序和类型是否重要?比如说,如果Frizzly
定义如下:
typedef struct {
uint16_t b[2];
uint32_t a;
}
Run Code Online (Sandbox Code Playgroud)
在第二个示例中进行强制转换后,b
现在由不兼容(uint32_t
)类型的内存支持.转换是否仍然有效(或者更确切地说,通过转换指针访问值)?是否会更改任何元素a
更改第一个元素的值i
(以及相反的方式),就像禁用严格别名一样?
另外,如果以上内容有效,如果我有这样的结构怎么办:
typedef struct {
void *m;
uint16_t hooah[4];
} Bar;
Run Code Online (Sandbox Code Playgroud)
如果我是正确的话,以下演员会破坏别名规则:
void test(char *boo, size_t dee) …
Run Code Online (Sandbox Code Playgroud) 我有一个非常令人兴奋的库,可以翻译点:它应该适用于任何点类型
template<class T>
auto translate_point(T &p, int x, int y) -> decltype(p.x, p.y, void())
{
p.x += x;
p.y += y;
}
template<class T>
auto translate_point(T &p, int x, int y) -> decltype(p[0], void())
{
p[0] += x;
p[1] += y;
}
Run Code Online (Sandbox Code Playgroud)
translate_point
将使用具有public x
和y
member的点,它也将与元组/可索引容器一起使用,其中x
和y
分别由第一个和第二个元素表示.
问题是,其他库定义了一个点类公共x
和y
,但也允许索引:
struct StupidPoint
{
int x, y;
int operator[](int i) const
{
if(i == 0) return x;
else if(i == 1) return y;
else …
Run Code Online (Sandbox Code Playgroud) 假设我有以下代码(简单的CRTP类层次结构).我想键入基类类型来保存自己输入(在我的实际代码中,我多次使用基类类型,基类需要几个模板参数),我需要与基类成为朋友,因为我想保留私有的实施.
template< class D >
class Base
{
public:
void foo() { *static_cast< D * >(this)->foo_i(); }
};
template< class T >
class Derived : public Base< Derived< T > >
{
public:
typedef class Base< Derived< T > > BaseType;
private:
// This here is the offending line
friend class BaseType;
void foo_i() { std::cout << "foo\n"; }
};
Derived< int > crash_dummy;
Run Code Online (Sandbox Code Playgroud)
铿说:
[...]/main.cpp:38:22: error: elaborated type refers to a typedef
friend class BaseType;
^
[...]/main.cpp:33:44: note: declared …
Run Code Online (Sandbox Code Playgroud) 基本上,我需要做类似的事情map
,但不是将函数应用于集合中的所有元素,而是需要将相同的(一组)值应用于函数集合(此操作是否具有名称?) .这可能看起来像一个简单的问题,但我还没有在Clojure中找到一种惯用的方法.对于我需要仅对每个函数应用一个值的特殊情况,例如,我已经使用过
(for [f funs] (f value))
Run Code Online (Sandbox Code Playgroud)
其中value
,当然,该值我需要每个功能采取作为一个参数,并且funs
是其需要与被调用的函数集合value
作为参数.
我的问题是,在Clojure中有一个函数可以做到这一点,但是对于任意数量的参数也是如此?或者上面确实是惯用的Clojure?
我读到CRTP的所有地方,实际上在我编写的代码中,CTRP类层次结构如下所示:
template< class T >
class Base
{
public:
int foo_interface()
{
return static_cast< T* >(this)->foo_implementation();
}
};
class Derived : public Base< Derived >
{
friend class Base< Derived >;
int foo_implementation()
{
return 5;
}
};
Run Code Online (Sandbox Code Playgroud)
也就是说,接口的名称和实现方法是不同的.现在,我通常不希望从外部看到实现方法,这需要上面的朋友声明,并且在多级层次结构中证明是一个主要的kludge(即使使用此处描述的技巧).
现在,我想出了以下内容:
// Base class
template< class T >
class A
{
public:
int foo()
{
std::cout << "I'm in A's foo!\n";
return static_cast< T * >(this)->foo();
}
};
// Deriving class
class B : public A< B >
{ …
Run Code Online (Sandbox Code Playgroud) 假设我有以下类型:
data WaveFormatChunk = WaveFormatChunk {
compression :: Word16,
channels :: Word16,
sampleRate :: Word32,
averageBps :: Word32,
blockAlign :: Word16,
significantBits :: Word16
} deriving (Show)
Run Code Online (Sandbox Code Playgroud)
有没有办法将所有这些转换为ByteString(或类似的结构)批发(以你的C形式的方式)?如果没有,我必须编写一个单独将所有这些都放入列表的函数,是否至少有将函数粘贴到Word8列表中的函数?类似于putWordBBxe,除了字节字符串或列表(虽然我很可能因为我还没有正确读入Monads而严重错误,但在我看来,Get/Put主要用于流).
Data.Binary不是我正在寻找的东西,它似乎更有用的只是在磁盘上转储数据而不是以具有特定(和"错误")字节顺序的特定格式存储它.