Подтвердить что ты не робот

Как написать объявление типа функции Haskell без аргументов?

Как написать объявление типа функции haskell без аргументов?

4b9b3361

Ответ 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.