Mam boilerplate Haskell, który wygląda mniej więcej tak:Haskell dane typu dynamiczna zmiana
data Configuration
{ confA :: Integer
, confB :: Boolean
, confC :: String }
x = (\arg opt -> opt{ confA=arg })
y = (\arg opt -> opt{ confB=arg })
z = (\arg opt -> opt{ confC=arg })
i chciałbym, aby usunąć boilerplate, otrzymując coś wzdłuż linii:
setter :: (Config -> a) -> a -> Config -> Config
x = setter confA
y = setter confB
z = setter confC
Ale nie mam pojęcia, jak skonstruować taką funkcję setter
. Czy jest to w ogóle możliwe w (nie-szablonowym) haskell, czy też mam tutaj przeciwko cukrowi składni? Jeśli tak, to jak mógłbym zrobić coś takiego w szablonie haskell?
Uważam, że jest to poprawne. Składnia rekordów automatycznie tworzy dla ciebie * gettery *, ale są one bezużyteczne, gdy chcesz utworzyć * settery *. –