LINUX.ORG.RU

[Haskell] Не въеду что написал не так.

 


0

0

Хочу считать из файла input.txt строки и парсить целые числа.

Вот код. Он не работатет.

module Main(main) where

import System.IO

parsefunc [] = []
parsefunc x =
    let
        nums = ['0', '-', '1', '2', '3', '4', '5', '6', '7', '8', '9']
        somef [] b _ = b
        somef (a:as) b c | a <- nums = somef as b (c++a)
                         | True                      = somef as (b++[c]) []
    in
        somef x [] []

readInput :: IO ()
readInput = do
    inh <- openFile "input.txt" ReadMode
    outh <- openFile "output.txt" WriteMode
    inpStr <- hGetContents inh
    print (parsefunc "1 2 3")

main = do
    readInput

Учить только начал.

Хочу чтобы меня поправили и указали более расово верный вариант.

Ответ на: комментарий от chumpa

да-да. Это я тестировал, забыл исправить.

Valdemard
() автор топика

Если хочется самому написать чтение интов то лучше наверное так:

import Data.List
import Data.Char

readInt :: String -> Integer
readInt ('-':xs) = - readInt xs
readInt x | not (null x) && all isDigit x = foldl' (\a b -> a*10 + b) 0 $ map (fromIntegral . (subtract (ord '0')) . ord) x
          | otherwise = error "parse error"

imp ★★
()
Ответ на: комментарий от Valdemard

А чем плох read :: String -> Int ?

Ничем не плох - но может хочется самому написать (например в целях обучения).

imp ★★
()
Ответ на: комментарий от Miguel

> Кхм. "<-" здесь ни при чём вообще.

А как тогда?

Valdemard
() автор топика
Ответ на: комментарий от imp

Более идейно верный вариант:

import Data.List
import Data.Char
import Data.Function

readInt :: String -> Integer
readInt ('-':xs) = - readInt xs
readInt x | not (null x) && all isDigit x = foldl' (\a b -> a*10 + b) 0 $ map (fromIntegral . (flip (-) `on` ord) '0') x
          | otherwise = error "parse error"

imp ★★
()

Если ты так хочешь:

nums = '-':['0'..'9']

a `elem` nums

imp ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.