Polymorphic type in Haskell

The parameters and result of functions in Haskell can be one “concerate” type, e.g., BoolInt, etc; or polymorphic type, i.e., not a specified type, represented by a type variable, such as ab, and so on.

Take length function as an example:

length :: [a] -> Int

The return value must be Int type, but the input parmater is a list which can contain any type. But if the polymorphic type is constrained as a set of types, e.g. (+):

(+) :: Num a => a -> a -> a

Num is called “type class”, it means not all types can be use in (+) except the ones which belong to Num. This “constrianed” polynomical type (Num a in (+)) is referred as “Ad hoc polymorphism”, while “no constrianed” one (a in length) is referred as “Parametric polymorphism”.

Linking error of _ntl_gbigint_body in using NTL

I use NTL on ArchLinux, and there is a struct _ntl_gbigint_body which is actually not defined (refer this post):

 * This way of defining the bigint handle type is a bit non-standard,
 * but better for debugging.

struct _ntl_gbigint_body;
typedef _ntl_gbigint_body *_ntl_gbigint;  

You should pay attention to functions who depend on this struct, such as:

void _ntl_gcopy(_ntl_gbigint a, _ntl_gbigint *bb)   

Because for old NTL library, the function prototype generated by compiler is _ntl_gcopy(void*, void**):

$ readelf -sW libntl.so | c++filt | grep ntl_gcopy
2511: 000000000012b750   184 FUNC    GLOBAL DEFAULT   12 _ntl_gcopy(void*, void**)

While for new one it is _ntl_gcopy(_ntl_gbigint_body*, _ntl_gbigint_body**):

$ readelf -sW libntl.so | c++filt | grep ntl_gcopy
615: 0000000000148500   202 FUNC    GLOBAL DEFAULT   11 _ntl_gcopy(_ntl_gbigint_body*, _ntl_gbigint_body**)

So if you meet linking error as following:

undefined reference to `_ntl_gcopy(void*, void**)'

It should be NTL header files and library mismatch. The header files are old, while library is new.

Notice the linking library position on Ubuntu

This week, I ported tcpbench from OpenBSD to Linux. The idiomatic method of OpenBSD is putting the linking library in front of generating final target:

cc -g -O2 -Wall -levent -o tcpbench tcpbench.c

However this doesn’t work in Ubuntu since its the linker uses --as-needed option. So I change the Makefile to put the library at the end:

cc -g -O2 -Wall -o tcpbench tcpbench.c -levent

Please refer this discussion if you are interested.

First installation of OpenBSD-current

I have an old laptop, and tried to install OpenBSD-current on it. Unfortunately, no matter from OpenBSD 6.3 to upgrade, or install it from scratch. the machine couldn’t boot successfully. It displayed:

>>OpenBSD/amd64 BOOT 3.39

Then it flashed one line (I couldn’t see that line clearly, and it should display loading something), and the system would reboot again.

At the end, I gave up, and install OpenBSD-current on a virtual machine.


Create only root partition during installing OpenBSD

The default partitions of installing OpenBSD is not appropriate for me:
3I need more space for /, since I want to build source code. So I just create one partition:

1 2

Please notice when creating partitions, there are some useful commands. Such as p, which displays current partition status:


? is for help:


Use z to delete all partitions:


Create the root partition and save it:

7 8

Easy OpenBSD Partition Scheme.