Можно ли создать новую запись с помощью линз?

Если у меня есть тип записи с линзами, можно ли создать новую запись без использования базовых средств доступа к записям?

{-# LANGUAGE TemplateHaskell #-}

import Control.Lens
import Control.Lens.TH

data Foo = Foo { _s :: String
               , _b :: Bool
               } deriving (Show, Eq)

makeLenses ''Foo

Я мог бы сделать Foo экземпляром Data.Default, а затем изменить def с помощью линз, но не все типы записей будут иметь разумные значения по умолчанию. Есть ли у Control.Lens собственный способ сделать это?


person Peter Hall    schedule 25.08.2013    source источник
comment
Вы всегда можете использовать Foo{} по умолчанию, оставив все поля неопределенными.   -  person Sjoerd Visscher    schedule 25.08.2013
comment
Спасибо! Я даже не знал, что там можно опускать поля. Я просто предполагал, что это будет ошибка компиляции.   -  person Peter Hall    schedule 25.08.2013
comment
Обратите внимание, что это не сработает, если Foo содержит строгие поля.   -  person shachaf    schedule 25.08.2013
comment
Хороший вопрос @shachaf, я этого не учел. Таким образом, для строгих полей требуется экземпляр Default, и поэтому, вероятно, это правильный путь, чтобы избежать хрупкого кода.   -  person Peter Hall    schedule 26.08.2013
comment
Также обратите внимание, что вы сталкиваетесь с проблемой линз, меняющих тип. Например. для data Foo a = Foo { _x, _y :: a } линзы x и y по отдельности не могут изменить тип, так как вы должны изменить поля x и y одновременно.   -  person shachaf    schedule 27.08.2013
comment
(Есть предложенный механизм, который можно использовать для создания линз, меняющих тип, которые будут работать там, но я не думаю, что кто-то до сих пор написал для него код.)   -  person shachaf    schedule 27.08.2013
comment
Итак, в заключение: Это минное поле! :)   -  person Peter Hall    schedule 27.08.2013


Ответы (1)


Нет, в настоящее время нет возможности сделать это. Вам придется использовать что-то вроде Foo{} по умолчанию или не использовать объектив для построения записи. Однако в объективе уже есть проблема, посвященная этому.

person bennofs    schedule 25.08.2013
comment
Спасибо за ссылку на билет github. Там интересное обсуждение! - person Peter Hall; 26.08.2013