Първо малка корекция на вашето определение за square_cps
:
square_cps :: Int -> ((Int -> r) -> r)
square_cps x = \cont -> cont (square x)
^^^
Като алтернатива можете да напишете:
square_cps x cont = cont (square x)
Имайте предвид, че това работи, въпреки че сигнатурата на типа прави square_cps
да изглежда като функция само на един аргумент.
Сега сигнатурата на типа за square_cps'
не може да работи. Начинът, по който е написан, означава, че можете да получите Int
от (Int -> r) -> r
, което е функция, която връща r
.
За да обърнете аргументите към square_cps
, първо напишете този еквивалентен тип подпис:
square_cps :: Int -> (Int -> r) -> r
^ ^ ^--- result
| \--- second arg
\--- first arg
и идентифицирайте аргументите, както е показано. След това размяната на първия и втория аргумент води до този подпис:
square_cps' :: (Int -> r) -> Int -> r
square_cps' cont x = square_cps x cont
Като цяло сигнатурата a -> b -> c
е еквивалентна на a -> (b -> c)
, т.е. конструкторът на типа функция се асоциира отдясно.
person
ErikR
schedule
06.12.2014