Я второй Yacoby использую read
, но имейте в виду, что и head
/ tail
, и read
являются частичными функциями и могут завершиться ошибкой в пустом списке. Я думаю, что лучше избегать head
, если вместо этого вы можете использовать сопоставление с образцом. Например,
get3rd :: String -> String
get3rd s =
case (take 3 $ words s) of
[_,_,w] -> w
otherwise -> ""
Эта функция безопасна для любого ввода (она просто возвращает пустую строку, если есть менее 3 слов). Конечно, если вы абсолютно уверены, что списки всегда непусты, вы можете использовать head
/ tail
.
С помощью read
вы можете либо ловить исключения (не очень удобно), либо использовать reads
вместо этого:
toInt :: String -> Maybe Int
toInt s =
case reads s of
[(i,_)] -> Just i
otherwise -> Nothing
-- test cases
main = do
print . toInt . get3rd $ "1 2 3"
print . toInt . get3rd $ "one two three"
print . toInt . get3rd $ "short list"
Этот toInt
возвращает Just
число или Nothing
, если он не может проанализировать. В качестве альтернативы вы можете использовать Safe library и функцию readMay
.