Código César
-
Código fuente:
caesar : { n} ([8], String n) -> String n //{n}是变量定义,()是变量约束,[8]用于指明位宽,String n表示长度为n的序列,这里的位宽是约束,因为ascii码都是8bit位宽的; caesar (s, msg) = [ shift x | x <- msg ] //caesar的定义是,将msg序列依次赋值给x,x进行移位后形成新的序列; where map = ['A' .. 'Z'] <<< s //map的定义是将['A','B'..]这条序列循环左移s; shift c=map @ (c - 'A') //shift c的定义是取map序列中的第c-'A'个元素;
-
Cabe señalar que hay dos espacios delante de donde, y el turno está alineado con el mapa de arriba, de lo contrario se informará un error;
-
Cabe señalar que: la siguiente equivalencia, es decir, la cadena y la secuencia son equivalentes, y el carácter es equivalente al código ASCII correspondiente;
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" ['A' .. 'Z'] [65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90]
-
Cabe señalar que el comando set ascii = on solo es válido para cadenas, aunque las cadenas y las secuencias son equivalentes;
Main> :set ascii=on Main> "ABC" "ABC" Main> ['A' .. 'Z'] [65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90]
-
Tal vez la primera línea del código aún no se entienda bien, puede consultar la séptima página del documento para una mayor comprensión:
- Primero defina un conjunto de variables {n, m, a};
- Redefinir el conjunto de restricciones (n * m == 12, Literal 12 a, fin m);
- Finalmente, defina la descripción de la salida [n] [m] a, es decir, una secuencia de n de longitud, los elementos de la secuencia son una secuencia de m de longitud y el tipo de cada valor en la secuencia de m de longitud es a;
- La restricción literal nos dice que a es un número que puede llegar al menos a 12;
Cryptol> split [1..12] Cannot evaluate polymorphic value. Type: { n, m, a} (n * m == 12, Literal 12 a, fin m) => [n][m]a Cryptol> :t split [1..12] split [1 .. 12] : { n, m, a} (n * m == 12, Literal 12 a, fin m) => [n][m]a