LINUX.ORG.RU

История изменений

Исправление qnikst, (текущая версия) :

{-# LANGUAGE RankNTypes #-}
data T = TI Int
       | TF Float
       | TS String

foo :: T -> (forall a . (a -> String) -> a -> String) -> String
foo (TI x) printerf = printerf show x
foo (TF x) printerf = printerf show x
foo (TS x) printerf = printerf id x

можешь не благорадить. Вот это то, что ты хотел сделать.

*Main> foo (TI 1) ($)
"1"
*Main> foo (TF 0.5) ($)
"0.5"
*Main> foo (TS "yo!") ($)
"yo!"

правда мой мозг отказывается понимать зачем тебе нужна такая конструкция..

Исправление qnikst, :

{-# LANGUAGE RankNTypes #-}
data T = TI Int
       | TF Float
       | TS String

foo :: T -> (forall a . (a -> String) -> a -> String) -> String
foo (TI x) printerf = printerf show x
foo (TF x) printerf = printerf show x
foo (TS x) printerf = printerf id x

можешь не благорадить. Вот это то, что ты хотел сделать.

*Main> foo (TI 1) (\f y -> f y)
"1"
*Main> foo (TF 0.5) (\f y -> f y)
"0.5"
*Main> foo (TS "yo!") (\f y -> f y)
"yo!"

правда мой мозг отказывается понимать зачем тебе нужна такая конструкция..

Исправление qnikst, :

{-# LANGUAGE RankNTypes #-}
data T = TI Int
       | TF Float
       | TS String

foo :: T -> (forall a . (a -> String) -> a -> String) -> String
foo (TI x) printerf = printerf show x
foo (TF x) printerf = printerf show x
foo (TS x) printerf = printerf id x

можешь не благорадить. Вот это то, что ты хотел сделать.

*Main> foo (TI 1) (\f y -> f y)
"1"
*Main> foo (TF 0.5) (\f y -> f y)
"0.5"

правда мой мозг отказывается понимать зачем тебе нужна такая конструкция..

Исходная версия qnikst, :

{-# LANGUAGE RankNTypes #-}
data T = TI Int
       | TF Float
       | TS String

foo :: T -> (forall a . (a -> String) -> a -> String) -> String
foo (TI x) printerf = printerf show x
foo (TF x) printerf = printerf show x
foo (TS x) printerf = printerf id x

можешь не благорадить. Вот это то, что ты хотел сделать.