2013-03-01 2 views
0

У меня есть следующие программы:впустить странное поведение

mnr = [0,1,2,3,4,5,6] :: [Int] 
name = "Max Mustermann" :: String 
kzn = "e53X" :: String 

t1 = ("p1",(take 2.tail)mnr, (take 3.words.(let no n= name;in no))"No"); 
{-result: t1 == ("p1",[1,2],["Max","Mustermann"]) -} 

Почему «Нет» игнорируется и что let no n= name;in no делать?

ответ

12

Это довольно сумасшедший письменный код. Давайте попробуем разрешить это по частям.

Прежде всего, t1 является кортежем типа (a,b,c). Давайте напишем t1 = (x,y,z) и попробуем разобраться. Довольно ясно, что a - String, а x - "p1".

Вторым компонентом является ((take 2) . tail) mnr, то есть take 2 [1,2,3,4,5,6], то есть [1,2]. Таким образом, b - [Int], и y - [1,2]. Имеет смысл.

Третий компонент странно написан. Прежде всего,

let no n = name in no 

просто определяет функцию \n -> name, т.е. постоянной функции, возвращающей name. Это более красиво написано как const name. Итак, у вас есть состав (take 3) . words . (const name), и вы применяете его к "No". Ну, (const name) "No" - это, очевидно, name, то есть "Max Mustermann". Таким образом, words применяется к ["Max", "Mustermann"], а затем take 3 доставит вам первые три элемента, что опять ["Max", "Mustermann"]. Это z выше, и показывает, что c - [String].

Всего в итоге вы получите t1, имеющий тип (String, [Int], [String]) и значение ("p1", [1,2], ["Max", "Mustermann"]).


Код для третьего компонента должны быть очищены, но, как вы чистите его зависит от того, что вы действительно хотите делать дальше. Однако, поскольку он стоит сейчас, он очень запутан и просто путает вас и других.

+0

Блестящий !!! +1 – Ingo

+0

спасибо этот пример из экзамена – sherif

+5

Тот, кто поставил этот экзамен, довольно садистский. –