Ввод данных с помощью Haskell - PullRequest
5 голосов
/ 05 января 2012

Back Story : В попытке лучше понять Haskell и функциональное программирование, я дал себе несколько заданий.Мое первое задание - создать программу, которая могла бы просматривать набор данных (набор чисел, слов в блоге и т. Д.), Искать шаблоны или повторения, группировать их и сообщать о них.

Звучит легкодовольно.:)

Вопрос : Я бы хотел, чтобы программа запустилась, создав переменную списка из данных в текстовом файле.Я знаком с функцией readFile , но мне было интересно, есть ли более элегантный способ ввода данных.

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

. / haskellprogram textfile.txt

Есть ли функция, которая позволит это?

Ответы [ 4 ]

12 голосов
/ 05 января 2012
import System.Environment

main :: IO ()
main = do
  args <- getArgs
  -- args is a list of arguments
  if null args
    then putStrLn "usage: ./haskellprogram textfile.txt"
    else do contents <- readFile $ head args
            putStrLn $ doSomething contents

doSomething :: String -> String
doSomething = reverse

Этого должно быть достаточно, чтобы начать. Теперь замените reverse на что-то более ценное:)

Говоря о разборе некоторых входных данных, вы можете рассмотреть возможность разбивки ваших данных на lines или words, используя соответствующие функции из Prelude.

4 голосов
/ 06 января 2012

Тонкий Массив, я не могу удержаться от упоминания своего любимого, когда впервые изучал Хаскелл, interact:

 module Main where
 main = interact doSomething

 doSomething :: String -> String
 doSomething xs = reverse xs

затем вы используете его как cat textfile.txt | ./haskellprogram | grep otto или что-то еще. В Data.Text есть также вариант, с которым вы можете познакомиться, и несколько других в других библиотеках string-ish.

4 голосов
/ 05 января 2012

Вы ищете функцию getArgs .

1 голос
/ 06 января 2012

Игра с относительно новым пакетом ReadArgs :

{-# LANGUAGE ScopedTypeVariables #-}

import ReadArgs (readArgs)

main = do
  (fname :: String, foo :: Int) <- readArgs
  putStrLn fname

Тестирование ...

$ runhaskell args.hs blahblah 3
blahblah

Одно раздражение с readArgs состоит в том, чтоне работает, если у вас есть только один аргумент. Хммм ...

Если у вас есть нужное имя файла как String, вы можете использовать readFile как обычно.

...