Как написать объявление типа функции haskell без аргументов?
Как написать объявление типа функции Haskell без аргументов?
Ответ 1
Нет такой функции, как функция без аргументов, которая будет просто значением. Конечно, вы можете написать такое объявление:
five :: Int
five = 5
Это может выглядеть по-другому, как вы просили, если я его сделаю
five' :: () -> Int
five' () = 5
но это полностью эквивалентно (если вы не напишете что-то нелепое, как five' undefined
) и избыточное 1.
Если вы имеете в виду что-то вроде, в C
void scream() {
printf("Aaaah!\n");
}
то это опять же не функция, а действие. (Программисты C действительно называют это функцией, но вы можете лучше сказать процедуру, все поймут.) То, что я сказал выше, имеет почти то же самое, вы использовали бы
scream :: IO()
scream = putStrLn "Aaaah!"
Обратите внимание, что пустой ()
в этом случае не имеет ничего общего с отсутствием аргументов (что следует уже из-за отсутствия ->
стрелок), вместо этого это означает, что также нет возвращаемого значения, это просто действие "только для побочных эффектов".
1 Фактически, он отличается одним из релевантных способов:
five
является константной аппликативной формой, что означает ее мемуатацию. Если бы я определил такую константу каким-то окольным способом (например, sum $ 5 : replicate 1000000 0
), то длительный расчет будет выполняться только один раз, даже если five
оценивается несколько раз во время прогона программы. OTOH, где бы вы не выписали five' ()
, расчет был бы сделан заново. Ответ 2
Так как функции в Haskell чисты (их результат зависит только от их аргументов), эквивалент функции без аргументов является просто значением. Например, one = 1
.