Я думаю, что при заданных параметрах (-ях) указанного типа функция никогда не должна прерываться.Тип Haskell, представляющий подмножество другого типа
Но возьмите этот, казалось бы, безобидный код:
readInts :: String -> [Int]
readInts = map read . words
Он имеет тип подписи, который является слишком общим, на самом деле, она не будет выполнена для любой строки, не сочиненной разделенных пробелами целых чисел, его тип должен тогда:
readInts :: SpaceSeparatedIntegersString -> [Int]
когда программа терпит неудачу, когда вы пытаетесь построить SpaceSeparatedIntegersString
, что не уважает указанные критерии.
Осуществляет идею
SpaceSeparatedIntegersString
разумную идею?Если это так, как я могу реализовать такой тип? (Я прошу только общую идею/tip/nudge в правильном направлении, а не полный код)
Должен ли я просто признавать, что моя функция не будет выполнена, если форматирование
String
неверно (то есть мое заявление в начале из этого вопроса не так)?Должен ли я использовать предложение охраны в определении функции?
Альтернатива: 'readInts :: String -> Maybe [Int]'. Если вы хотите избежать всех частичных функций, вам понадобится что-то подобное с подходом 'newtype' в конце концов (например,' fromString :: String -> Maybe SpaceSeparatedIntegersString'). Что лучше? Это зависит; это зависит. –
Я бы просто согласился с тем, что функции могут потерпеть неудачу. В идеальном мире пользователи будут делать все правильно, все входы будут проверены, ..., но все происходит. В любом случае, между вашими «идеальными» функциями и вашими «несовершенными» функциями будет слой. Если вы спрашиваете, нужно ли сделать этот слой как можно меньше, то да, это хорошая идея с чем угодно. – BalinKingOfMoria
Если это то, что вы считаете наиболее важным, вы, вероятно, захотите использовать Coq вместо Haskell. В Coq все функции являются тотальными (и вы должны доказать это компилятору). Обратите внимание, однако, что это требование делает язык * non * Turing-complete (хотя он все еще может выражать довольно много функций). – Bakuriu