Я пытаюсь заставить работать следующее, но я не могу понять, что это правильно. Я ожидаю, что что-то вроде этого будет работать:
newtype Skill = Skill { name :: String, other :: Int }
newtype Feature = Feature { name :: String, something :: Boolean }
newtype Special = Special { name :: String, different :: String }
type Namable = forall r. { name :: String | r }
changeName :: forall m. String -> m Namable -> m Namable
changeName newName (ctor namable) =
ctor $ namable { name = newName }
Ошибка выглядит примерно так:
Error 1 of 1
Unable to parse module:
unexpected "namable"
expecting @, ::, operator or )
В основном я хочу добавить функциональность в набор newtype
с. Это не всегда будет весь набор и не всегда больше, чем один, но я хотел бы написать фактическую функциональность, «неосведомленную» о типах, которые я определяю. Если в будущем я решу добавить newtype Statistic
, я хочу, чтобы он «просто работал».
Чтобы улучшить этот вопрос, мне было интересно, есть ли название для типа подписи, которую я ищу?
f :: forall m a. (a -> a) -> m a -> m a
Похоже на менее общее Functor
определение.