это отвечает восклицательный знак.
Я видел использование через замену $ на $!. Но что-то оно не особо помогает:
length1 :: [a] -> Int
length1 [] = 0
length1 (x:xs) = 1 + (length1 $ xs)
length2 :: [a] -> Int
length2 [] = 0
length2 (x:xs) = 1 + (length2 $! xs)
Обе функции работают одинаково. Да еще и добавление знака доллара потребовало изменять вид фукнции и ухудшать ее читаемость (возможно, есть способ использовать + и инфиксно, но у меня не получилось придумать код, который бы скомпилировался бы)
Еще я видел, что где-то перед аргументами функции пишут восклицательный знак. Относится ли это к строгим вычислениям? Если да, то как его использовать?
https://www.fpcomplete.com/haskell/tutorial/all-about-strictness/ вот это почитай
Не совсем понимаю, как ты хочешь тут оптимизировать, потому что плохая производительность этого кода не зависит от ленивости/энергичности
Если знаком с лямбда исчислением, то попробуй поредуцировать свое выражение на бумажке в нормальном порядке. Если не знаком, то неплохо было бы почитать
Обсуждают сегодня