问题描述
我只是想知道..
是否实际上已在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]
因此, a
中的每个Enum
类型必须至少提供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
,因此没有恶性循环。