.. 在哪里定义?

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 -> afromEnum :: 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,因此不存在恶性循环。