Следующие две функции очень похожи. Они читают из [String] n элементов, либо [Int], либо [Float]. Как я могу определить общий код? Я не знаю какого-либо механизма в Haskell, который поддерживает передачу типов в качестве аргументов.Типы пропуска в качестве аргументов функции в Haskell?
readInts n stream = foldl next ([], stream) [1..n]
where
next (lst, x:xs) _ = (lst ++ [v], xs)
where
v = read x :: Int
readFloats n stream = foldl next ([], stream) [1..n]
where
next (lst, x:xs) _ = (lst ++ [v], xs)
where
v = read x :: Float
Я нахожусь на начальном уровне в Haskell, поэтому любые комментарии к моему коду приветствуются.
Вам не нужно складывать здесь, вы можете получить с помощью простой карты. например 'map read stream :: [Int]' Также вы можете посмотреть, почему вы хотите использовать foldr в Haskell, а не foldl. –
@EdwardKmett Спасибо за ваше предложение. Я действительно хочу читать только первые n элементов и возвращать список и остальную часть потока. Вчера я был супер сон, и не мог продумать. Я думаю, вы хотите сказать, что с помощью foldr я могу использовать конструктор: прямо справа? Позднее я переписал его как «(карта читала firstn, rest), где (firstn, rest) = splitAt n stream', очень похоже на то, что вы предложили. –
Вам не нужно вставлять 'where'; вы можете поместить 'next (lst, x: xs) _ = ...' и 'v = ...' в последовательные строки. – sdcvvc