deniok: (lambda cube)
[personal profile] deniok
Хорошая хотя и простая задачка возникла в процессе проверки домашних заданий. Чем отличается поведение следующих двух функций, и в чем причина такого отличия:
diff xs = do
    p <- zip xs (tail xs)
    return $ abs (fst p - snd p)

diff' xs = do
    p <- zip (tail xs) xs
    return $ abs (fst p - snd p)

Date: 2014-04-15 05:27 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Мне не очень нравится термин "строгий" по отношению к функциям с богатой семантикой. Он слишком грубо описывает действительность. Ну вот сделаю я обычную take более определенной, чем в Prelude, переставив местами два первых уравнения:
take' _ []              =  []
take' n _      | n <= 0 =  []
take' n (x:xs)          =  x : take' (n-1) xs
Раньше take была строгая по первому аргументу, а стала "иногда нестрогая":
> take undefined []
*** Exception: Prelude.undefined
> take' undefined []
[]
Но понятно, что это же совершенно маргинальное улучшение!

Profile

deniok: (Default)
deniok

February 2022

S M T W T F S
  12345
6789101112
13141516171819
20212223 242526
2728     

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 21st, 2025 06:08 am
Powered by Dreamwidth Studios