Кастинг в Хаскеле - PullRequest
       17

Кастинг в Хаскеле

3 голосов
/ 26 ноября 2009

а) Мне нужно разыграть от String до int в Haskell. У меня есть функция, которая получает третье слово в предложении в виде строки, но мое третье слово во всех моих предложениях - это числа (int), как я могу привести от строки к int, чтобы потом я мог использовать число для выполнения таких операций, как добавить или мульт?

getThirdWord :: String -> String
getThirdWord = head . tail . tail . words

б) Я использую Visual Haskell Studio. Как я могу использовать такие функции, как map и zip в Visual Haskell Studio? Есть ли какие-нибудь плагины, которые мне нужно включить в мои VHS, чтобы они работали?

Заранее большое спасибо!

Ответы [ 4 ]

14 голосов
/ 26 ноября 2009

ответ Якоби , конечно, правильно. Позвольте мне сделать два замечания:

  1. read является очень общим. Он не только конвертирует String в Int. Тип возвращаемого значения зависит от контекста. В этом случае getThirdWord определяется как String -> Int, поэтому read знает, что делать. Это не всегда так, поэтому, если вы когда-нибудь получите ошибку компиляции при использовании read, помните следующее: вам может понадобиться помочь Haskell выяснить тип возвращаемого значения.
  2. В настоящее время вы используете head . tail . tail, чтобы получить третий элемент списка. Что, если вы хотите, скажем, 23-й элемент? Более удобное и удобочитаемое решение - использовать (!!): таким образом вы можете получить элемент списка по любому индексу. Таким образом:

    thirdWordAsInt :: String -> Int 
    thirdWordAsInt = read . (!! 2) . words
    

    (обратите внимание на 2 вместо 3, так как индексы индексируются 0).

6 голосов
/ 26 ноября 2009

Что касается кастинга, взгляните на функцию read .

getThirdWord :: String -> Int
getThirdWord = read . head . tail . tail . words

Visual Haskell Studio представляется только IDE в том смысле, что бэкэнд использует GHC , который полностью поддерживает спецификацию Haskell и включает библиотеки, которые включают карта и сложить.

3 голосов
/ 26 ноября 2009

Я второй 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.

0 голосов
/ 26 ноября 2009

С вами, ребята, все в порядке, но я пишу, потому что я думаю, что есть очень элегантная и полезная функция, которую я придумал, когда учился помогать с read ing и show ing текста.

as :: (Read a, Show a) => (a -> a) -> String -> String
as f = show . f . read

Prelude> as (+1) "7"
"8"

Prelude> as (+(1/2)) "5"
"5.5"

Полезно, а? = Р. Также хз! n получает n-й элемент xs. Посмотрите ответы других, чтобы узнать, как легко печатать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...