2015-10-07 18 views
5

Tôi đã sau datatype định nghĩa là kỷ lụcLàm cách nào để lặp qua các trường bản ghi?

data Config = Config 
    { field1 :: String 
    , field2 :: String 
    , field3 :: String 
    } 

Tôi muốn để lặp qua mỗi lĩnh vực Config, áp dụng một số chức năng String -> String, ví dụ tail và nhận được trong trở lại mới Config.

Cách thành ngữ để làm điều này là gì? Tốt hơn là không có thư viện của bên thứ 3 nặng.

+2

Lệnh 'chức năng head' trả về một 'Char'. Tôi có đúng để hiểu rằng bạn muốn loại của các lĩnh vực của bạn để thay đổi tùy thuộc vào những gì các chức năng cung cấp trả về? –

+1

uniplate là một thư viện generics nhẹ có thể có thể làm điều đó một cách dễ dàng. – jberryman

+0

@MichaelSteele lỗi của tôi, giống như 'đuôi' sẽ trả về cùng một loại' Chuỗi'. Tôi đã cập nhật các câu hỏi –

Trả lời

13

Vâng, cách tốt nhất để làm điều đó có lẽ sẽ là

{-# LANGUAGE DeriveFunctor #-} 

type Config = Config' String 
data Config' a = Config 
    { field1 :: a 
    , field2 :: a 
    , field3 :: a 
    } deriving (Functor) 

configHeads :: Config -> Config' Char 
configHeads = fmap head 
+0

monotraversable sẽ là một thay thế. –

+0

Đối với chuỗi, điều này có vẻ giống như cách rõ ràng để đi. Thật không may là cách tiếp cận này ngăn chặn tối ưu hóa tốt đẹp trong một số tình huống khác. – dfeuer

Các vấn đề liên quan