首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我不能在GHCi中定义类型?

这个问题是关于在GHCi(Glasgow Haskell Compiler Interactive)中定义类型的限制的原因。GHCi是一个交互式的Haskell编程环境,它允许用户在命令行中输入Haskell代码并立即查看结果。然而,在GHCi中定义类型的能力是有限的。

在Haskell中,类型定义通常在模块的顶层进行。这意味着,在GHCi中定义类型时,它需要遵循这个规则。由于GHCi是一个交互式环境,它不支持在顶层定义类型,因为这可能会导致语法和解析问题。

要在GHCi中定义类型,您需要使用以下语法:

代码语言:txt
复制
:type <type_name> = <type_definition>

例如,要定义一个名为Person的类型,您可以使用以下命令:

代码语言:txt
复制
:type Person = String

这将在GHCi中定义一个名为Person的类型,它是一个字符串类型。

总之,由于GHCi的限制,您不能在GHCi中直接定义类型。但是,您可以使用:type命令来定义类型别名。如果您需要在Haskell代码中定义类型,最好使用.hs文件并使用Haskell编译器进行编译。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

来看看几种 Monad来看看几种 Monad

我们这边来细看 do 是如何使用,以及为什么我们十分倚赖他。 来看一下熟悉的例子: ghci> Just 3 >>= (\x -> Just (show x ++ "!")) Just "3!"...当定义一个函数的时候,一个模式匹配就会跳到下一个模式。如果所有都不匹配,那就会造成错误,整个程序就当掉。另一方面,如果在 let 中进行模式匹配失败会直接造成错误。...至于在 do 表示法模式匹配失败的话,那就会调用 fail 函数。他定义在 Monad 的 type class 定义猪。...我们可以不用担心标准函数库的型态是否有遵守单子律。但之后我们定义自己的型态时,我们必须自己检查是否有遵守单子律。不用担心,他们不会很复杂。...m >>= return 会等于 m 这一个可能不像第一定律那么明显,但我们还是来看看为什么会遵守这条。

1K20
  • Haskell 自定义type与typeclass

    Prelude 定义了一种叫做*Mayb*的类型:它用来表示这样一种值——既可以有值也可能空缺,比如数据库某行的某字段就可能为空。...可以在 ghci 输入 :info YourTypeClass。所以输入 :info Num 会告诉你这个 typeclass 定义了哪些函数,还有哪些类型属于这个 typeclass。...的instance,而map就是fmap的实现(这一点看下ghci:info Functor的打印结果就能确认)。...instance Functor Maybe where fmap f (Just x) = Just (f x) fmap f Nothing = Nothing 看到这不免有些疑问,为什么上面...但类型也有自己的标签,叫做kind,kind是类型类型。 我们可以在ghci通过:k来获取一个类型的kind: Prelude> :k Int Int :: * *代表这个类型是具体类型

    7410

    Heskell与函数式编程

    就一行代码,涉及了三个函数 1)filter :从价格集合筛选出大于20的价格,形成新的集合 2)map:对1产生的新集合进行变换处理,这里的处理是每个元素*0.9,也就是打九折 3)sum:对2产生集合进行求和处理...的电脑是Windows,在Windows下打开cmd,输入ghci,就能进入编程界面,在这个界面能够进行简单的编码,比如下面: ? 这里简单的进行了一次 3+5的求和操作。...这段代码定义了一个函数findMax,输入两个数字x和y,输出x和y的最大值,这里要注意下haskell内if else语句else是不可或缺的,不像JAVA可以只写if写else。...类型和函数 Haskell是静态类型,也就是编译器在编译过程中就能够明确每个值的类型,当发现类型匹配的时候,在编译过程中就会报错。比如输入这样一个函数: ?...我们先看下函数的类型是怎么样的,之前我们定义过一个函数findMax,这里看下 ?

    83270

    热爱函数式的你,句句纯正的 Haskell【类型篇】

    认识下 GHCi 的命令: :l 用来导入当前路径或者指定路径下的文件; Prelude> :l "C:\\Users\\ User\\Desktop\\HelloWorld\\HelloWorld.hs...每个类型类下面都写了一些该类型定义的函数,我们可以接着打印输出体验: // fromInteger 是 Num 类型类下的函数,可以将一个一个的整数转为一个重载的数类型 a Prelude> :t...,如果定义了一个新的类型,只要这个类型实现了类型声明的函数这个类型就属于该类型类了; 小结 入门第一篇,类型在程序语言中非常重要!...可以看出,Haskell 的严格定义类型和 javaScript 还是有较大差异,一个强类型,一个弱类型~ 强类型适合大型项目的维护,弱类型与动态性结合,开发简单,处理灵活; Haskell 的类型类...看到这里,点个赞吧~ 掘文不易,还需鼓励~ 是掘金安东尼,输出暴露输入,技术洞见生活,再会~

    95630

    模块_Haskell笔记2

    二.声明 模块用来组织代码,比如把功能相近的函数放到同一个模块 例如二叉树的模块定义: module BTree -- 声明要暴露出去的函数及数据类型 ( Tree , singleton , add..., fromList , find ) where -- 引入依赖模块 -- 定义数据类型及函数 data Tree a = EmptyTree | Node a (Tree a) (Tree a)...或者暴露值构造器,仅允许通过工厂方法等方式获取该类型值(常见的比如Map.fromList): module MyModule (Tree, factory) 缺点是,这样做就无法使用值构造器进行模式匹配了...所以 (==) `on` compare `on` 都是非常棒的惯用套路 P.S.可以通过:browse 命令查看模块的所有函数及数据类型定义类型声明 Data.Char String...但缺点是构造集合会对元素进行排序,所以得到的去重结果不保留原顺序(List.nub会保留) 参考资料 Haskell/Modules Haskell data type pattern matching:模式匹配自定义数据类型

    1.7K30

    Haskell

    Haskell是一种标准化的、通用纯函数式编程语言,有非限定性语义和强静态类型,在Haskell,函数是一等公民。...ghc包含了三个主最要的部分: ghc 编译器 ghci 交互式解析器和调试器 runghc 以脚本的方式运行Haskell 而我们即将学习的起点就是在ghci来练习Haskell的基本语法。...Haskell还可以定义跟数学的过程一一对应,这就很有意思了。我们知道计算机学科其实也是一门数学学科,你想想,能跟数学的过程一一对应的语言,在研究领域,得多牛逼。...比如add::Int -> Int -> Int,其实这翻译成我们能看懂的函数就是int (*add)(int,int) ,函数add会返回一个int类型。...觉得,这小小门入,就不耽误大家了,如果大家有兴趣,一定可以从(http://learnyouahaskell.com/)Haskell官方指定的在线图书中找到属于自己的乐趣。

    87030

    深入typeclass_Haskell笔记4

    零.Typeclass与Class Typeclass就是Haskell的接口定义,用来声明一组行为 OOP的Class是对象模板,用来描述现实事物,并封装其内部状态。...派生自某类(deriving (SomeTypeclass))是说具有某类定义的行为,相当于OOP的实现了某个接口,所以具有接口定义的行为 一.声明 class关键字用来定义新的typeclass:...前两条类型声明是接口所定义的行为(通过定义函数类型来描述)。...后两条函数实现是可选的,通过间接递归定义来描述这两个函数的关系,这样只需要提供一个函数的实现就够了(这种方式称为minimal complete definition,最小完整定义) P.S.GHCi环境下...a换成了具体的TrafficLight类型,并实现了==函数(不用同时实现/=,因为Eq类声明了二者的关系) 试着让自定义类型成为Show类成员: data Answer = Yes | No | NoExcuse

    50210

    newtype_Haskell笔记8

    一.ZipList与List 在List场景,xs ys表示从左侧xs取出函数作用于右侧ys的每一项,有两种实现方式: 笛卡尔积 拉链式的一一结对 分别对应[]和ZipList,例如: import...除此之外,就与data关键字没什么区别了 P.S.关于值构造器与参数,见类型_Haskell笔记3 三.对比type和data 关键字 作用 应用场景 data 定义自己的(数据)类型 想要定义完全新的类型...libraries/base/GHC/Err.hs:79:14 in base:GHC.Err undefined, called at :12:1 in interactive:Ghci1...libraries/base/GHC/Err.hs:79:14 in base:GHC.Err undefined, called at :37:10 in interactive:Ghci17...明明只有一个值构造器(不需要“看应该用Tuple的哪个值构造器”): data () = () 我们知道没必要去检查应该用Tuple的哪个值构造器,但Haskell不知道,因为按照约定,data关键字定义的数据类型可以有多个值构造器

    61530

    七夕送礼很发愁?自己编写一个区块链送女友吧~

    Cofree MerkleF Block 完成两件事:它递归应用 MerkleF 为 Merkle 树的所有深度生成一个类型,并且为树的每一个节点关联一个 Block 类型的注释。...如果每个节点知道其子节点,向结尾添加一个新块需要修改树的每个节点。所以 MerkleF 生成一个链,而不是一个树。 Protolude 是一个最近在中型工程所用的对 Prelude 的替换。...我们为什么选择这个奇怪的 MerkleF 类型而不是下面这个简单类型呢?...下面是序列化与反序列化我们所需类型的完整代码: 仅包含了 deserialize 与 serialize 从而使得模块的最终结果更为清晰。...Generic 是一种将值转换为可为序列化器(JSON,XML,Binary,等)所用以及许多其他类型类用来提供有用的默认定义的轻量级“语法树”的一种方法。

    927160

    基础语法_Haskell笔记1

    ->与类型声明的->语义相同,都表示“映射到”(maps to) 函数组合 数学的函数组合的表达方式是f·g(x) = f(g(x)),Haskell与之类似: fg = f . g 用到的运算符是...),例如: isPositive n | n > 0 = True | otherwise = False where关键字 where关键字跟在guard后面,用来定义函数声明需要用到的变量,及辅助函数...(10, 50) sArea = show area -- 可以定义函数 addSpace s = ' ' : s -- where可以嵌套,在辅助函数定义辅助函数...,如果是在GHCi环境,在整个交互过程都可见 Case表达式 最常见的case表达式就是函数定义时参数的模式匹配(case表达式的语法糖): tail' [] = "empty list" tail'...,1到100所有满足该判定规则的元素组成的集合即为所求 像集合定义一样,元素可以来自多个既有集合,例如: > [ x * y | x <- [1, 2, 3], y <- [4, 5] ] [4,5,8,10,12,15

    1.9K30

    铁定不纯的IO_Haskell笔记5

    ,IO与Maybe :: * -> *类似,都是接受一个具体类型参数,返回具体类型(比如IO ()) P.S.其中,newtype与data类型声明类似,语法和用法也都基本相同,newtype是更严格的类型声明...圈定不纯环境类似于async function,I/O Action只能出现在do语句块,这一点类似于await P.S.实际上,执行I/O Action有3种方式: 绑定给main时,作为入口函数...放到do语句块里 在GHCi环境输入I/O Action再回车,如putStrLn "hoho" 执行 可以把main当做普通函数在GHCi环境下执行,例如: > :l echo [1 of 1] Compiling...System.Directory模块,用来删除指定文件 removeFile :: FilePath -> IO () -- 定义在System.Directory模块,用来重命名指定文件 renameFile...:: FilePath -> FilePath -> IO () 注意,其中removeFile和renameFile都是System.Directory模块定义的(而不是System.IO的),文件增删改查

    1.3K30

    类型_Haskell笔记3

    类型声明的小写字母(例如a)叫做类型变量,未加限定的类型变量(如++类型的a)相当于泛型,用到类型变量的函数称之为多态函数 比如show :: Show a => a -> String的含义是show...MyEmptyList)) > _map (+ 1) (_fromList [1, 2, 3]) 2 :> (3 :> (4 :> MyEmptyList)) 派生 只有Show类(typeclass)的成员才能在...GHCi环境直接输出(因为输出前调用show :: Show a => a -> String),所以,让Shape成为Show的成员: data Shape = Circle Float Float...> EmptyValue < Singleton True > Singleton < Mytype 3 "a" True > Mytype 3 "a" < Mytype 4 "a" True 首先看类型声明的次序...如果起别名的话,类型声明就只能是这样: inPhoneBook :: String -> String -> [(String, String)] -> Bool 当然,这个场景看起来似乎有些小题大做

    91540

    Haskell 基础

    第一个函数 创建doubleMe.hs文件,编写如下代码: doubleMe x = x + x 保存,打开ghci,输入 Prelude> :l doubleMe.hs 这样我们就加载了我们的doubleMe...List 列表由方括号以及被逗号间隔的元素组成: Prelude> [1,2,3] [1,2,3] 空列表:[],列表中所有元素必须是同一类型。...,但要求类型必须一致 head函数取list第一个元素 tail函数取list除第一个元素之后的全部 last返回list最后一个元素 init返回一个除去list最后一个元素的全部 length返回list...1.0, 1.25, ..2.0] [1.0,1.25,1.5,1.75,2.0] Prelude> [1, 4, 15] [1, 4, 7, 10, 13] 之所以没有输出15是因为15不属于我们定义的系列元素...]] Tuple (1,2) (True, "a", 1) Tuple List: [(1,2),(3,4),(5,6)] 但是[(1,2),(3,4,5),(5,6)]是会报错的,因为元素类型不一致

    6910

    公司同事用float和double,结果导致..

    BigDecimal 阿粉相信大家对这个肯定陌生,只要你公司的业务涉及到一些比较精确的数字的时候,都会使用 BigDecimal,而不会去使用 Float 和 double,并且在数据库做设计的时候...这个时候就有人问了,定义 float 类型为 1.4 的时候为什么不是 1.399999999呢?这就是不进行浮点计算的时候,在十进制里浮点数能正确显示。...阿里手册定义 数据库 小数类型为 decimal,禁止使用 float 和 double。 在存储的时候,float 和 double 都存在精度损失的问题,很可能在比较值的时候,得到不正确的 结果。...BigDecimal 要注意的东西 1.BigDecimal(double) 创建一个具有参数所指定双精度值的对象 但是这种类型是都不推荐使用的,为什么推荐使用,我们来试一下 BigDecimal...也就是说存在精度损失风险,在精确计算或值比较的场景可能会导致业务逻辑异常 既然推荐使用 BigDecimal(double)。那么推荐使用什么呢?

    80640

    Framework 4.0 新关键字dynamic 之我见(一)

    有了这个关键字,我们在写代码时就可以不用确定某个变量、属性、方法(包含void方法,文中所说的方法都是包含void的)的类型了,一切都交给Framework吧。...其实在CTP版本,已经是这样了,不过觉得,虽然他在编译时不能确定他的类型,但所有的类型都是继承于Object类型的,为什么智能感知没有把Object的几个共有方法给感知出来呢???...(等了一个版本还是这样,真有点失望)。 那我们来看看,到底程序为什么那么慢吧。用IL DASM看看。...的理解是,它先定义成object类型,然后在Runtime时,在用Invoke去调用ToString方法,省略的部分还有很多,其实都是因为它的不确定性,动态特性,所以把所有可能的类型都列举了出来,然后通过在...今天最后说说和var跟dynamic的区别,我们都知道var能在编译时确定类型,而且也有智能感知,但是var只能在局部使用(方法体),而且必须初始时赋予它值,它才能在编译时去确定是何种类型,不过他们都有一个特点

    49070

    手写一个orm框架-1

    (恩系列,说明可能会写好久,╮(╯▽╰)╭) 现在有很多的现成的orm框架,为什么还要自己写一个? 框架这种东西个人认为想要了解其中的原理,还是要自己尝试实现一个来的比较快。...自己写一个框架感觉最主要的还是解决自己的问题,先让自己用起来方便嘛~ 要实现什么功能? 单表的增删该查肯定是需要的。现阶段不需要支持连表查询,因为平常也写这种sql。...为什么要写成orm类型的呢? 用起来方便啊~ 不用写sql啊,最烦写sql了。 能不能在生产上用呢?...java的自定义注解。 sql的基础知识。 spring jdbc相关知识,就是jdbcTemplate。因为不太想在写一边jdbc的东西。...在对数据库操作的时候通过反射获取class的相关信息,然后根据操作类型,生成sql,最后执行sql就好了。

    54620

    C#——向上转型

    Animal animal = new Bird(); //向上转型 animal.Eat(); } }        上述例子我们定义了一个动物类...(其中有吃东西的方法),鸟类继承了动物类(重写了基类吃东西的方法),主函数中生命animal为Animal类型的对象,但运行结果并不是我们预期的那样,而是显示“是鸟,要吃东西!”。...在网上看到一个问题,有人说“如果子类中所需要的功能在父类存在,就使用向上转型;如果父类所需要的功能在子类存在,就使用向下转型”,但是如上例所述,Bird是Animal的子类,Bird已经继承了Animal...的方法,为什么还要使用向下转型呢?...即为什么定义Animal的时候要用“Animal animal=new Bird();”而不是“Bird animal=new Bird();”呢?

    71520
    领券