.. 在哪里定义?
Where is .. defined?
我只是想知道 ..
是否真的在 Haskell 代码中的任何地方定义,就像在 the Prelude 中一样? enumFromTo
是一样的吗?我不明白哪个是定义?
enumFromTo x y = map toEnum [fromEnum x .. fromEnum y]
[ e1 .. e3 ] = enumFromTo e1 e3
它是语法的一部分,在报告中指定,section 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]
因此 在 Enum
中的每个类型 a
必须至少提供 toEnum :: Int -> a
和 fromEnum :: a -> Int
的定义。如果它没有提供自己的定义,例如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]────────────────────┘
对于 Int
类型本身有一个 specific 定义定义在库的某处,所以 enumFromTo
的默认定义不用于Int
,没有恶性循环。
我只是想知道 ..
是否真的在 Haskell 代码中的任何地方定义,就像在 the Prelude 中一样? enumFromTo
是一样的吗?我不明白哪个是定义?
enumFromTo x y = map toEnum [fromEnum x .. fromEnum y]
[ e1 .. e3 ] = enumFromTo e1 e3
它是语法的一部分,在报告中指定,section 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]
因此 在 Enum
中的每个类型 a
必须至少提供 toEnum :: Int -> a
和 fromEnum :: a -> Int
的定义。如果它没有提供自己的定义,例如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]────────────────────┘
对于 Int
类型本身有一个 specific 定义定义在库的某处,所以 enumFromTo
的默认定义不用于Int
,没有恶性循环。