Haskell Применить функцию стрелки только к типу результатов?

StackOverflow https://stackoverflow.com//questions/10708935

  •  13-12-2019
  •  | 
  •  

Вопрос

Возможно ли в Haskell применить конструктор типа стрелки функции (->), чтобы только его правый тип (например,: (-> A)), чтобы получить тип конструктора вида * -> *?

Это было полезно?

Решение

Нет, это в настоящее время невозможно. Существуют определенные ограничения в систему типа Haskell, которые позволяют ему быть полезными и удобными для большинства случаев, и это один из этих ограничений. Ваша лучшая альтернатива - использовать newtype.

newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r }
.

newtypes - это просто теги, чтобы помочь компилятору знать, как правильно выполнить TypeCheck и выполнять направленные типовые диспетчеризации (Typleasases). Предположительно, вы хотели перевернуть аргументы типа, чтобы обеспечить некоторую экземпляр TypeClass. Это просто означает, что всякий раз, когда вы хотите использовать функции Thy Typlass, вы должны украсить любые конкретные входы с FuncFlip, а также отстраиваются какие-либо конкретные выходы с unFuncFlip. Это немного большего, чем желательно, но на самом деле не так плохо, потому что он заставляет вас явно определить, какой экземпляр Typleass вы хотите использовать.

Вы можете создать экземпляр newtype Для этого, который может или не может быть удобным для вас.

instance Newtype (FuncFlip r a) (a -> r) where
  pack = FuncFlip
  unpack = unFuncFlip
.

Дальнейшее чтение: Есть ли -Левел комбинатос? "

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top