2014-02-09 2 views
3

Пусть у меня есть некоторые константы, которые я хочу назвать:Тип объявления для констант

foo = 1234 
bar = 5678 
baz = 1337 

По умолчанию типа Num a => a но не это считается хорошей практикой объявлять типы этих констант в явном виде?

Делая это, как это было бы довольно громоздким:

foo :: Int 
foo = 1234 

bar :: Int 
bar = 5678 

baz :: Int 
baz = 1337 

Вы можете сделать это следующим образом:

foo, bar, baz :: Int 
foo = 1234 
bar = 5678 
baz = 1337 

Который работает хорошо, когда есть не слишком много, но когда число констант увеличивается, вам, возможно, придется обернуть их, а также, похоже, вы повторяетесь.

Как об этом ?:

foo = 1234 :: Int 
bar = 5678 :: Int 
baz = 1337 :: Int 

бы, что считается хорошим стилем? Что такое конвенция?

Update

На самом деле, похоже, GHC не рассматривает последний пример, имеющие какие-либо заявления типа вообще, так как он предупреждает о «верхнем уровне связывания без указания типа подписи».

+0

На самом деле, из-за ограничения мономорфизма, тип по умолчанию * не будет * быть «Num a => a'. Но может потребоваться другой тип, чем GHC выбирает по умолчанию, так что это по-прежнему важный вопрос. – delnan

+1

Я бы предпочел эту версию 'foo, bar, baz :: Int', но это вопрос вкуса. – adamse

+1

На самом деле, похоже, что GHC не рассматривает последний пример, имеющий какие-либо объявления типа, поскольку он предупреждает о «привязке верхнего уровня без подписи типа». –

ответ

4

Это зависит от того, почему вы хотите все эти константы, конечно. Лично я был бы склонен давать явные подписи типов, да. Если у вас есть много из них, чтобы объявить, я бы, вероятно, пойти на

foo = 1234 :: Int 
bar = 5678 :: Int 
baz = 1337 :: Int 

GHC может предупредить об отсутствии объявления типа верхнего уровня, но выше привязки совершенно мономорфные, так что вы не будете платить не во время выполнения полиморфизм, и код явно читаем. (И вы можете легко добавить больше записей позже.)

Я мог бы спросить, почему вам нужно определить так много целочисленных констант и смиренно предположить, что может быть более идиоматический способ достижения того, что вы пытаетесь сделать - но это будет предметом другого вопроса. В данном вопросе, в принципе, любые варианты вариантов, которые вы предложили, являются «прекрасными», но мои личные предпочтения (и это все, что есть) будут для примера выше.

+0

Мне хорошо известно, что это не так уж идиоматично. В этом случае это была привязка к библиотеке C. Я завершу это в нечто другое. –

+0

@ EmilEriksson Я подозревал, что это может быть так ... хотя в этом случае не будут ли эти константы автоматически генерироваться каким-то инструментом? (В этом случае было бы неважно, насколько это типично.) – MathematicalOrchid

+0

Да, я, вероятно, должен использовать hsc2hs или c2hs, но сначала я хотел попробовать его вручную. –

Смежные вопросы