我正在使用fsharp类型推理,我正在尝试理解它们是如何工作的.为什么会这样
List.filter List.head
Run Code Online (Sandbox Code Playgroud)
是类型bool list list -> bool list list
?
我正在尝试在F#中实现一个队列到目前为止这是我所拥有的,但我认为它的行为更像是一个堆栈:
type 'a queue = NL| Que of 'a * 'a queue;;
let enque m = function
|NL -> Que(m, NL)
|Que(x, xs) -> Que(m, Que(x, xs));;
let rec peek = function
|NL -> failwith "queue is empty"
|Que(x, xs) -> x;;
let rec deque = function
|NL -> failwith "queue is empty"
|Que(x, xs) -> xs;;
let rec build = function
| [] -> NL
| x::xs -> enque x (build xs);;
Run Code Online (Sandbox Code Playgroud)
除了enque之外,这些操作工作正常,我想这样做,因此它在队列的后面而不是前面添加了一个新元素.
我在 C 中创建以下结构,只有数据包结构将通过 UDP 套接字发送。我想打包结构以避免在不同的计算机上出现不同的对齐方式(不确定我是否需要打包两者或只打包我发送的一个)。当我编译它时,我收到以下两个警告:
warning: ignoring #pragma ( [-Wunknown-pragmas] #pragma(pack);`
Run Code Online (Sandbox Code Playgroud)
为什么我的编译指示被忽略?以及如何解决这个问题。
#pragma push(pack, 1);
struct packet{ // the actual packet within the node
uint32_t seqnum;
uint32_t checkSum;
uint32_t numPackets; // number of packets to send
char data[1024]; // the data in the packet
};
struct packetNode{ //for the linked list
struct packet p;
struct packetNode *next;
};
#pragma pop(pack)
Run Code Online (Sandbox Code Playgroud)
gcc 版本:
gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
Run Code Online (Sandbox Code Playgroud) 我试图弄清楚以下函数的最坏情况渐近时间复杂度:
let rec min = function
| [k] -> k
| k::ks -> if k <= min ks then k else min ks
Run Code Online (Sandbox Code Playgroud)
我知道它效率不高,因为在第二次模式匹配中调用min两次.但是你怎么能找到这个功能更糟糕的情况呢?
我试图找到一个矩阵的转置,我知道我的代码到目前为止是不正确的但是我更关心的是为什么当我用transpose测试它时[[4;3];[1;5];[6;7]]
它会进入第一个匹配的情况,这是一个空列表?
let rec transpose = function
| [] -> failwith "Error, no matrix supplied"
| [[]] -> []
| [[x]] -> [[x]]
| x::xs -> let temp = List.head x :: (List.map (fun n -> List.headn) xs)
temp :: transpose(xs);;
Run Code Online (Sandbox Code Playgroud) 我试图手动重写List.filter到目前为止我有这个:
let rec filter f = function
|[] -> []
|x::xs -> if f x = true then x @ filter f xs
else filter f xs;;
Run Code Online (Sandbox Code Playgroud)