Poniższe dwie funkcje są bardzo podobne. Czytają z elementów [String] n, [Int] lub [Float]. Jak mogę wykluczyć wspólny kod? Nie znam żadnego mechanizmu w Haskell, który obsługuje przekazywanie typów jako argumentów.Typy przekazywania jako argumenty funkcji w 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
Jestem na poziomie początkującego Haskella, więc wszelkie uwagi na mój kod są mile widziane.
Nie trzeba złożyć tutaj, można dostać się z prostego mapie. na przykład 'map read stream :: [Int]' Możesz również sprawdzić, dlaczego chcesz używać foldr w Haskell zamiast foldl. –
@EdwardKmett Dzięki za sugestię. Naprawdę chcę tylko odczytać pierwsze n elementów i zwrócić listę oraz resztę strumienia. Wczoraj byłem bardzo śpiący i nie mogłem się zastanowić. Myślę, że chcesz powiedzieć, że z foldr mogę używać konstruktora: bezpośrednio w prawo? Później przerobiłem go na '' (map read firstn, rest), gdzie (firstn, rest) = splitAt n stream', całkiem podobny do tego, co zasugerowałeś. –
Nie musisz zagnieżdżać 'gdzie'; możesz umieścić 'next (lst, x: xs) _ = ...' i 'v = ...' w kolejnych wierszach. – sdcvvc