Hai chức năng sau đây rất giống nhau. Họ đọc từ một phần tử [String] n, hoặc [Int] hoặc [Float]. Làm thế nào tôi có thể yếu tố mã phổ biến ra? Tôi không biết bất kỳ cơ chế nào trong Haskell hỗ trợ các kiểu truyền đi như là các đối số.Vượt qua các loại làm đối số cho một hàm trong 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
Tôi ở cấp độ mới bắt đầu của Haskell, vì vậy mọi nhận xét trên mã của tôi đều được chào đón.
Bạn không cần phải gấp đây, bạn có thể nhận được bởi với một bản đồ đơn giản. ví dụ. 'bản đồ đọc stream :: [Int]' Ngoài ra bạn có thể muốn xem xét lý do tại sao bạn muốn sử dụng foldr trong Haskell chứ không phải là foldl. –
@EdwardKmett Cảm ơn đề xuất của bạn. Điều tôi thực sự muốn là chỉ đọc các phần tử n đầu tiên và trả về danh sách và phần còn lại của luồng. Tôi đã rất buồn ngủ ngày hôm qua, và không thể suy nghĩ được. Tôi nghĩ rằng bạn muốn nói rằng với foldr tôi có thể sử dụng constructor: trực tiếp phải không? Sau đó tôi viết lại nó như là '(bản đồ đọc firstn, phần còn lại) trong đó (firstn, rest) = splitAt n stream', khá giống với những gì bạn đề nghị. –
Bạn không cần phải làm tổ 'where'; bạn có thể đặt 'next (lst, x: xs) _ = ...' và 'v = ...' trong các dòng liên tiếp. – sdcvvc