作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一些通用功能
genericFunc :: a -> b
genericFunc x = doSomeHardWork
genericFunc
可以做到。
genericFunc :: ParticularType -> b
genericFunc x = doSomeEasyWork
genericFunc
的最佳方法是什么? , 这样当用于
ParticularType
,它将
doSomeEasyWork
,但是当用于其他类型时,它将
doSomeHardWork
?我特别排除了使用不同名称或不同模块的选项。
最佳答案
这可以通过在类定义中定义通用方法并在实例中覆盖它来使用类型类来完成。将始终使用被覆盖的函数。
class ContainsInt c where
toList :: c -> [Int]
-- generic function
elem :: Int -> c -> Bool
elem n x = Prelude.elem n (toList x)
instance ContainsInt () where
toList _ = []
-- Override the generic function for type ()
elem _ _ = False
{-# RULES #-}
给出语用。
class ContainsInt c where
toList :: c -> [Int]
elem :: ContainsInt c => Int -> c -> Bool
elem n x = Prelude.elem n (toList x)
-- Replace 'elem' by 'elemUnit' if it has the same type
{-# RULES "elem()" forall. elem = elemUnit #-}
elemUnit :: Int -> () -> Bool
elemUnit _ _ = False
foo :: ContainsInt c -> Int -> [c] -> [Bool]
-- Must use the generic function
foo n cs = map (elem n) cs
useFoo :: Int -> [()] -> [Bool]
-- If 'foo' is inlined and 'elem' is not inlined, then this function will contain a rewritable call to 'elem'.
-- Otherwise rewriting cannot happen.
useFoo n cs = foo n cs
关于function - 根据类型为泛型函数提供不同的函数体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8467391/
我是一名优秀的程序员,十分优秀!