Интересно, если это возможно, чтобы иметь функцию (несколько похожий на dataToTag#
), как:Есть ли способ определить во время выполнения, в GHC, является ли абстрактное значение функцией?
isFunction# :: a -> Bool
или, вероятно, что то же самое:
isFunction# :: Any -> Bool
который возвращает True
тогда и только тогда значения, переданного в качестве аргумента из a тип a -> b
(или, если на то пошло, a => b
) во время выполнения для некоторых типов a
и b
, или newtype
, базовый тип которого (поэтому он «видит» через newtype
s, b ut, конечно, не data
), не форсируя его аргумент. Я не видел ничего подобного в GHC.Prim сам, но я, возможно, что-то пропустил, или, возможно, это возможно с помощью ручного CMM-примока или что-то в этом роде.
Теперь, когда вопрос мне пришло в голову мне любопытно об ответе за свое имя (question Y), но первопричиной мне пришло в голову (вопрос X) является то, что жалоба обычно выдвигаемые против seq
является то, что ему нарушает эту эквивалентность, позволяя наблюдать разницу между undefined
и \_ -> undefined
, и мне было интересно, можно ли сделать версию seq
(myseq a = if isFunction# a then flip const a else seq a
), которая по-прежнему «магически полиморфна» (работает forall a
), но просто оставляет функции в одиночку ,
Как 'a => b' тип функции? –
@ReinHenrichs: это на самом деле. '=>' desugared to '->' в GHC Core. –
@ReinHenrichs (Передача слова A.K.A.) – glaebhoerl