js2*_*010 17 enums haskell enumeration definition typeclass
我只是想知道是否..真的在 Haskell 代码中的任何地方定义,就像在Prelude 中一样?是enumFromTo一样的吗?我不明白定义是什么?
enumFromTo x y = map toEnum [fromEnum x .. fromEnum y]
[ e1 .. e3 ] = enumFromTo e1 e3
Run Code Online (Sandbox Code Playgroud)
Wil*_*ess 22
它是语法的一部分,在报告的第 3.10 节中指定。
是的,它使用enumFrom等函数转换为代码:
对于您对问题的编辑:您显示的定义是Enum类型类中的“默认定义” 。它在您链接的前奏中就这么说:
class Enum a where
succ, pred :: a -> a
toEnum :: Int -> a
fromEnum :: a -> Int
enumFrom :: a -> [a] -- [n..]
enumFromThen :: a -> a -> [a] -- [n,n'..]
enumFromTo :: a -> a -> [a] -- [n..m]
enumFromThenTo :: a -> a -> a -> [a] -- [n,n'..m]
-- Minimal complete definition:
-- toEnum, fromEnum
-- _______ -- ____
-- NOTE: these default methods only make sense for types -- **** NB
-- that map injectively into Int using fromEnum
-- and toEnum.
succ = toEnum . (+1) . fromEnum
pred = toEnum . (subtract 1) . fromEnum
enumFrom x = map toEnum [fromEnum x ..]
enumFromTo x y = map toEnum [fromEnum x .. fromEnum y]
enumFromThen x y = map toEnum [fromEnum x, fromEnum y ..]
enumFromThenTo x y z =
map toEnum [fromEnum x, fromEnum y .. fromEnum z]
Run Code Online (Sandbox Code Playgroud)
因此,每个类型a是在 Enum必须至少提供给定义为toEnum :: Int -> a和fromEnum :: a -> Int。如果它没有为 eg 提供自己的定义,enumFromTo :: a -> a -> [a]那么将使用它的默认定义:
enumFromTo :: a -> a -> [a]
enumFromTo x y = map toEnum [fromEnum x .. fromEnum y ]
-- ?a??a? ?a? ?a?
-- ???Int????? ???Int?????
-- ?Int->a? ??????????[Int]????????????
-- ????????????????[a]?????????????????????
Run Code Online (Sandbox Code Playgroud)
并且对于Int类型本身,在库的某处定义了一个特定的定义,所以默认的定义enumFromTo不用于 for Int,因此不存在恶性循环。