在阅读http://uncyclopedia.wikia.com/wiki/Haskell(并忽略所有"令人反感"的东西)时,我偶然发现了以下一段混淆代码:
fix$(<$>)<$>(:)<*>((<$>((:[{- thor's mother -}])<$>))(=<<)<$>(*)<$>(*2))$1
Run Code Online (Sandbox Code Playgroud)
当我在ghci(导入Data.Function和Control.Applicative)之后运行那段代码时,ghci打印所有2的幂的列表.
这段代码如何工作?
当我使用GHC编译以下代码时(使用-Wall标志):
module Main where
data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show)
insert :: (Ord a) => a -> Tree a -> Tree a
insert x EmptyTree = Node x EmptyTree EmptyTree
insert x (Node a left right)
| x == a = Node a left right
| x < a = Node a (insert x left) right
| x > a = Node a left (insert x right)
main :: IO() …Run Code Online (Sandbox Code Playgroud) 根据http://en.wikipedia.org/wiki/Heap_%28data_structure%29#Comparison_of_theoretic_bounds_for_variants,它采用Θ(logn)(转换为O(logn))来执行减小键操作.但是,似乎没有包含具有减少键操作的二进制堆实现的站点.
因此,由于Web上缺少实现,是否可以在二进制堆中执行reduce-key操作?
对于C(short,int,long等)中的"标准"有符号整数类型的所有操作,如果它们产生超出[TYPE_MIN,TYPE_MAX]间隔的结果(其中TYPE_MIN,TYPE_MAX是最小值和最大整数值),则表现出未定义的行为可以通过特定整数类型存储的.
但是,根据C99标准,所有intN_t类型都需要具有二进制补码表示:
7.8.11.1精确宽度整数类型
1. typedef名称intN_t指定有符号整数类型,其宽度为N,无填充位和二进制补码表示.因此,int8_t表示具有正好8位宽度的有符号整数类型.
这是否意味着intN_tC99 中的类型在整数溢出的情况下表现出良好定义的行为?例如,这段代码定义明确吗?
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main(void)
{
printf("Minimum 32-bit representable number: %" PRId32 "\n", INT32_MAX + 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 假设在C实现上(例如在x86 C编译器上)USHRT_MAX = 65535和INT_MAX = 2147483647.那么,以下陈述是否明确定义?
unsigned short product = USHRT_MAX * USHRT_MAX;
Run Code Online (Sandbox Code Playgroud)
根据C99标准中的以下内容,两个操作数都被提升为int(因为它int可以表示所有可能的值unsigned short),因此,结果没有明确定义,因为会发生溢出(65535 ^ 2 = 4294836225 > 2147483647),这意味着值product不是明确界定:
6.3.1.1-1
如果int可以表示原始类型的所有值,则该值将转换为int; 否则,它将转换为unsigned int.这些被称为整数促销.(48)所有其他类型由整数促销不变.
48)整数提升仅适用于:通常的算术转换,某些参数表达式,一元+, - 和〜运算符的操作数,以及移位运算符的两个操作数的一部分,由它们各自指定小节.
但是,根据以下内容,结果是明确定义的,因为涉及无符号操作数的计算不会溢出:
6.2.5-9
有符号整数类型的非负值范围是相应无符号整数类型的子范围,并且每种类型中相同值的表示是相同的.(31)涉及无符号操作数的计算永远不会溢出,因为结果是无法用结果无符号整数类型表示减去模数,该数字大于可由结果类型表示的最大值.
product上述陈述中的变量是否具有明确定义的值?
编辑:在下列情况下会发生什么?
unsigned short lhs = USHRT_MAX;
unsigned short rhs = USHRT_MAX;
unsigned short product = lhs * rhs;
Run Code Online (Sandbox Code Playgroud) 在push_back时,列表占用大部分时间来分配内存.另一方面,当需要调整大小时,向量必须复制它们的元素.因此,哪个容器最适合存储邻接列表?
有时在vim中,我不小心输入:Q而不是:q在正常模式下.为了解决这个问题,我在.vimrc中添加了这个:
command Q q
Run Code Online (Sandbox Code Playgroud)
这适用于:Q,但是如果我键入:Q !, vim以"No!allowed"响应.我如何让vim接受:Q!并将其解释为:q!?
为了熟悉Haskell中的STM,我为Dining Philosophers问题编写了以下解决方案:
import Control.Concurrent
import Control.Concurrent.STM
import Control.Monad
import System.Random
type Fork = TVar Bool
type StringBuffer = TChan String
philosopherNames :: [String]
philosopherNames = map show ([1..] :: [Int])
logThinking :: String -> StringBuffer -> STM ()
logThinking name buffer = writeTChan buffer $ name ++ " is thinking..."
logEating :: String -> StringBuffer -> STM ()
logEating name buffer = writeTChan buffer $ name ++ " is eating..."
firstLogEntry :: StringBuffer -> STM String
firstLogEntry buffer = do …Run Code Online (Sandbox Code Playgroud) 我正在尝试按照本指南以及如何在默认帧缓冲区上启用SRGB支持的SDL2文档中以正确的伽马方式呈现典型的OpenGL颜色三角形.
这是我编写的代码,它绘制了三角形:
#include <SDL.h>
// Header file generated with glLoadGen
#include "gl_core_3_3.h"
#include <cstdlib>
void sdl_loop(SDL_Window* window);
static const char* const vertexSource = R"(
#version 330
in vec2 position;
in vec3 color;
out vec3 vs_color;
void main()
{
gl_Position = vec4(position, 0.0, 1.0);
vs_color = color;
}
)";
static const char* const fragmentSource = R"(
#version 330
in vec3 vs_color;
out vec4 fragColor;
void main()
{
fragColor = vec4(vs_color, 1.0);
}
)";
static const float vertices[] = { …Run Code Online (Sandbox Code Playgroud) 根据这个,可以在TR1 unordered_map中定义一个相等函数,如下所示:
#include <tr1/unordered_map>
using namespace std;
using namespace std::tr1;
struct foo{
...
bool operator==(const foo& b) const{
return ..;
}
};
unordered_map<foo,int> map;
Run Code Online (Sandbox Code Playgroud)
是否可以以相同的方式定义散列函数?