Le seguenti due funzioni sono estremamente simili. Leggono da [String] n elementi, [Int] o [Float]. Come posso calcolare il codice comune? Non conosco alcun meccanismo in Haskell che supporti i tipi di passaggio come argomenti.Passa i tipi come argomenti a una funzione in 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
Sono ad un livello principiante di Haskell, quindi qualsiasi commento sul mio codice è benvenuto.
Non è necessario piegare qui, si può ottenere con una semplice mappa. per esempio. 'map read stream :: [Int]' Potresti anche voler capire perché vuoi usare foldr in Haskell piuttosto che foldl. –
@EdwardKmett Grazie per il suggerimento. Quello che voglio veramente è leggere solo i primi n elementi e restituire la lista e il resto del flusso. Ero molto assonnato ieri e non riuscivo a pensare. Penso che tu voglia dire che con foldr posso usare il costruttore: direttamente giusto? In seguito l'ho riscritto come '(map leggi firstn, rest) dove (firstn, rest) = splitAt n stream', abbastanza simile a quello che hai suggerito. –
Non è necessario nidificare 'where'; puoi mettere 'next (lst, x: xs) _ = ...' e 'v = ...' in righe consecutive. – sdcvvc