Как заставить Haskell вычислить корректный полиморфный тип?

Самая легкая вещь состояла бы в том, чтобы отбросить Ваше соединение с помощью CurrPorts.

Однако, чтобы к модульному тесту Ваш код обработки исключений, возможно, необходимо рассмотреть абстракцию кода сетевого соединения и записать тупик, насмешку или декоратора, который выдает исключения по требованию. Вы тогда будете в состоянии протестировать логику обработки ошибок приложения, не имея необходимость на самом деле использовать сеть.

7
задан Dario 1 December 2009 в 20:24
поделиться

1 ответ

{-# LANGUAGE Rank2Types #-}
on' :: (a -> a -> b) -> (forall d. c d -> a) -> c e -> c f -> b
on' f g x y = f (g x) (g y)

Это приводит к

Prelude> :t on' (==)
on' (==) :: (Eq a) => (forall d. c d -> a) -> c e -> c f -> Bool
Prelude> :t on' (==) length
on' (==) length :: [e] -> [f] -> Bool

С другой стороны, эта подпись также делает переключение на 'id незаконным, что несколько менее желательно.


{-# LANGUAGE TemplateHaskell #-}
import Language.Haskell.TH
onE f g = do
    x <- newName "x"
    y <- newName "y"
    lamE [varP x, varP y] $ f `appE` (g `appE` varE x) `appE` (g `appE` varE y)
Prelude> :set -XTemplateHaskell
Prelude> $(onE [|(==)|] [|length|]) [1,2,3] ["a","b","c"]
True
Prelude> $(onE [|(==)|] [|id|]) 4 5
False
3
ответ дан 7 December 2019 в 16:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: