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

如何在Haskell getLine中只允许一种类型

在Haskell中,可以使用类型约束来限制getLine函数只接受特定类型的输入。要实现这一点,可以使用Haskell的类型类和类型约束。

首先,我们需要定义一个类型类,用于表示只允许一种类型的输入。我们可以将其命名为OneType,并定义一个函数isOneType来检查输入是否为指定类型。

代码语言:haskell
复制
class OneType a where
  isOneType :: a -> Bool

接下来,我们可以实现一个函数getOneTypeLine,它使用类型约束来限制输入类型为OneType的实例,并且只接受符合条件的输入。

代码语言:haskell
复制
getOneTypeLine :: OneType a => IO a
getOneTypeLine = do
  input <- getLine
  if isOneType input
    then return input
    else do
      putStrLn "Invalid input. Please try again."
      getOneTypeLine

在上述代码中,我们首先使用getLine获取用户输入,并通过isOneType函数检查输入是否为指定类型。如果输入符合条件,则返回输入值;否则,打印错误信息并递归调用getOneTypeLine函数,直到获得符合条件的输入。

要使用getOneTypeLine函数,我们需要为特定类型实现OneType类型类的实例。以下是一个示例,假设我们只允许输入为整数类型:

代码语言:haskell
复制
instance OneType Int where
  isOneType input = case reads input :: [(Int, String)] of
    [(x, "")] -> True
    _ -> False

在上述代码中,我们使用reads函数将输入解析为整数。如果解析成功且没有剩余字符,则认为输入为整数类型。

这样,当我们调用getOneTypeLine函数时,它将只接受整数类型的输入。如果输入不是整数类型,将会提示错误并要求重新输入。

请注意,以上代码仅为示例,可以根据需要进行修改和扩展。此外,腾讯云没有与Haskell直接相关的产品或服务,因此无法提供相关的产品和链接地址。

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

相关·内容

铁定不纯的IO_Haskell笔记5

写在前面 一直有个疑惑,Haskell号称纯函数式语言,那么铁定不纯的场景(肯定有副作用,或者操作本身就是副作用)如何解决?...Haskell提供了do语句块,也是用来隔离不纯的部分的 一.I/O action 先看个函数类型: > :t print print :: Show a => a -> IO () print函数接受一个...Show类参数,返回一个IO (),称之为I/O Action,也是一种类型,如下: > :k IO IO :: * -> * > :k IO () IO () :: * > :i IO newtype...放到do语句块里 在GHCi环境输入I/O Action再回车,putStrLn "hoho" 执行 可以把main当做普通函数在GHCi环境下执行,例如: > :l echo [1 of 1] Compiling....最后用forM(交换参数顺序)也可以,但出于语义习惯,forM常用于定义I/O Action的场景(根据[a]生成IO [b]) forever Control.Monad.forever :: Applicative

1.3K30

Monad_Haskell笔记10

P.S.关于computation context的详细信息,见Functor与Applicative_Haskell笔记7 用来解决context相关计算的另一个场景:怎样把一个具有context的函数应用到具有...\_ ->就很容易弄明白了 P.S.上面类型声明的forall是指∀(离散数学的量词,全称量词∀表示“任意”,存在量词∃表示“存在”)。...,因为默认所有的小写字母类型参数都是任意的: In Haskell, any introduction of a lowercase type parameter implicitly begins with...getLine putStrLn answer-- 用结合律解开do block嵌套 main = do unused <- getLine answer <- getLine putStrLn...从Maybe取函数只有两种结果:要么从Nothing取不出东西来,立即爆炸;要么从Just f取出个f,运算得到Just (f x),上一步(x)没炸的话就炸不了了 所以,从应用场景来看,Monad是一种计算语境控制

71550

当我们谈论Monad的时候(二)

Welcome to Haskell 在上一篇文章,我通过几个Java的例子简单的说明了Monad的本质和一些工程中常见的用途。接下来的文章就不再侧重于工程了,而是要慢慢向理论转换。...Haskell全符号的、被小括号包裹的函数默认是中缀的,比如这个函数的调用就是中缀形式f xs。接受一个容器内的函数和值,并将运算之后的结果重新放在容器。...在Haskell是这么表示的 pure :: a -> f a 因此就可以如此表示了 pure (*) Value 2 Value 3 总结一下,就可以得到Haskell对Applicative...在IO操作,这个优势还可以变得更加的明显。Haskell采用Monad实现IO相关的API,这个Monad就称为IO Monad。...Haskell的IO函数都会返回一个IO Monad,而上面的代码,我们并没有对每一条都使用之前的结果。对于部分IO Monad(putStrLn返回的),我们直接就抛弃了这些返回值。

78810

消失的编程语言

通用的编程语言,Python、Java和JavaScript,目前占据主导地位,而其他一些更为特定领域的语言似乎逐渐失宠。...3、Haskell Haskell已经过去了最辉煌的时光,这真是遗憾;许多程序员都希望他们知道如何在这个光辉的函数式编程语言中编码。...该语言曾经是首选,因为许多人开始使用其本机monads和代数数据类型编写大型金融程序。 Haskell从Miranda、Clean、HOPE和其他一些语言借鉴了元素,具有很多优点。...与更相关、更灵活的语言(Go和Python)相比,Haskell也遭受了竞争压力,这两种语言从2000年代开始挑战Haskell,以其强大和实用性继续挑战该语言。...毕竟,Go编程之所以重新在TIOBE指数占据一席之地是有原因的。

20330

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

---- theme: github 每次看到干尸鬼鲛起舞,都有一种说不出的难受,不行,发出来,让大家一起难受难受~ Haskell 是一门纯的函数式语言。...我们从 wiki 上可以找到以下要点: Haskell一种标准化的,通用的纯函数式编程语言,有惰性求值和强静态类型; 在Haskell,“函数是第一类对象”。...在 GHCi 里输入['H', 'e', 'l', 'l','o'],会得到 "Hello" Prelude> ['H', 'e', 'l', 'l','o'] "Hello" tuple 元组类型...我们在下一小节做更为细致的说明“类型类”~ 类型别名 一个数据的类型可以由多个其他的类型组成,在 Haskell ,可以用 type 关键字将这些复杂的类型替换成为其他简单的名字; Prelude>...可以看出,Haskell 的严格定义类型和 javaScript 还是有较大差异,一个强类型,一个弱类型~ 强类型适合大型项目的维护,弱类型与动态性结合,开发简单,处理灵活; Haskell类型

94030

浅谈 CC++ 的输入输出

因此,C 的输入输出函数, scanf() 和 printf() 等,是非类型安全的: 它们依赖于格式化字符串来指示输入/输出数据的类型。...因此,C++ 的输入输出函数, std::cin 和 std::cout 等,是类型安全的: 它们使用类型安全的 C++ 流语义,其中数据类型是静态确定的,而不是动态确定的。...getline() 是 C++ 的输入函数,可以用于从输入流读取一行文本数据,可以指定分隔符。getline() 可以替代 scanf() 和 cin 用于读取字符串类型数据。...在输出字符串时,需要注意字符串是否包含特殊字符,换行符、制表符等,需要使用相应的转义字符来表示。 可以使用格式化输出来控制输出的格式,输出精度、对齐方式等。...---- stringstream ---- stringstream 是 C++ 标准库提供的一种数据流对象,用于在内存对字符串进行输入输出操作。

42640

浅谈 CC++ 的输入输出

因此,C 的输入输出函数, scanf() 和 printf() 等,是非类型安全的: 它们依赖于格式化字符串来指示输入/输出数据的类型。...因此,C++ 的输入输出函数, std::cin 和 std::cout 等,是类型安全的: 它们使用类型安全的 C++ 流语义,其中数据类型是静态确定的,而不是动态确定的。...getline() 是 C++ 的输入函数,可以用于从输入流读取一行文本数据,可以指定分隔符。getline() 可以替代 scanf() 和 cin 用于读取字符串类型数据。...在输出字符串时,需要注意字符串是否包含特殊字符,换行符、制表符等,需要使用相应的转义字符来表示。 可以使用格式化输出来控制输出的格式,输出精度、对齐方式等。...---- stringstream ---- stringstream 是 C++ 标准库提供的一种数据流对象,用于在内存对字符串进行输入输出操作。

4.8K20

2019年需要关注的区块链智能合约开发平台

不过Solidity有一些严重的问题,包括算术溢出、类型错误以及曾经冻结了3亿美元的delegatecall漏洞。所有这些漏洞都是在开发语言层面存在的问题。...Waves RIDE Waves RIDE是一个图灵不完备(没有循环或递归)的、受Haskell启发的函数式编程语言,用于Waves区块链。...它的特点包括静态类型、惰性评估、模式匹配和用于决定交易是否允许完成的断言表达式。目前图灵完备的版本也在开发。Wave的智能合约支持目前在主网上已经激活。...Rust (via ewasm, Cardano client) Rust是一个类似C的底层开发语言,包含一些类似Haskel的安全特性,例如得到保证的常量引用以避免意外修改、静态阻止空指针异常、有状态类型只允许访问当前状态下的有效操作...、模式匹配分析以保证函数完整性(一个不匹配的模式将导致编译时错误)...基本上Rust类似于C++和Haskell的纯优点的继承者。

93110

什么是 Monad (Functional Programming)?函子到底是什么?ApplicativeMonad

一个函子Functor是任意类型,这些类型定义了如何应用 map (fmap in Haskell) 。...image.png fmap的输入参数是a->b函数,在我们这个案例是(+3),然后定义一个函子Functor,这里是Haskell的Just 2,最后返回一个新的函子,在我们案例,使用Haskell...澄清了函子的含义,那么如何在程序中表达它? 在Haskell,函子是在其上可以map over的东西。稍微有一点函数式编程经验,一定会想到数组(Array)或者列表(List),确实如此。...在Haskell这类的强类型语言中,我们甚至可以组装自己的Tuple Monad。...(组合箭头和元箭头映射这里省略) 函子这种映射实际是一种分解组合方式,对于这个过程我们可以用下面模拟形象地理解: 计算C集合每个函数的"结果", 但是不组合它们.

4.3K30

c++之复合类型笔记(一)

数组 数组是一种数据格式,能够存储多个同类型的值。 数组的初始化规则: 1)数组只有在定义的时候才能使用初始化。 2)初始化数组的时候,提供的值可以少于数组的元素数目。...辣椒 万万没想到,你竟然喜欢吃辣椒 但当姓名包含空格或制表符,输入姓名:“San Zhang”时,便得到下面结果: 你好,我的名字是iDoit! 你的名字是?...istream的类(cin)提供了一些面向行的类成员函数:getline()和get()。这两个函数都读取一行输入,直到到达换行符。...然而,getline()将丢弃换行符,而get()将换行符保留在输入序列。...例如,假设要使用getline()将姓名读入到一个包含20个元素的name数组,可以使用这样的函数调用: cin.getline(name,20); 对于代码2.1修改为cin.getline(),

40220

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

Haskell 值与函数是统一的,函数只是需要其他参数输入的值。如果定义的是函数,那么这个函数的行为在运行过程也是不会改变的,对于某一个特定的输入返回的结果总是确定的,这样的函数为纯函数。...再三强调,在 Haskell ,函数与值没有本质的区别,它可以是单一的定值,也可以是任意两个函数间的映射; 实际上,在 Haskell 世界里,所有的运算符号都可以被看做是函数,加号 + 是一个需要两个参数的函数...=函数体 // 类型 函数名 :: 参数1的类型->参数2的类型->......->结果类型 说这么多,不如在编译器感受感受: Prelude> f3 x y z=3*x+2*y-z Prelude> f3 1 2 3 4 Prelude> :t f3 f3 :: Num a =...λ表达式 Haskell 还有另外一种书写函数的格式,即 λ 表达式; // 定义方式 3 函数名= (\参数1 -> \参数2 -> ...

33210

EasyC++10,字符串初体验

这是EasyC++系列第10篇,我们来聊聊C++的字符串。 字符串 字符串定义 字符串就是连续的一连串字符,在C++当中, 处理字符串的方式有两种类型一种来自于C语言,也被称为C风格字符串。...另外一种是基于string类库。 C风格的字符串其实就是字符存储在char数组当中。不过它和一般的数组有一些区别,拥有一些特殊的性质。...所以下面这种写法是错误的: char c = "S"; 并且“S”其实表示的是字符串所在的内存地址,当我们把一个内存地址赋值给一个char类型的时候自然就会报错了。...字符串的读入 直接用字符串常量来初始化字符数组只是一种方式,另外一种常用的方式是只定义字符数组的长度,从外部读入数据,: char str[100]; scanf("%s", str); cin >...get有好几种变体,一种变体是读入一个字符,它有一种变体也可以读入一行字符串。不过唯一的区别是,get函数不会处理行尾的换行符。如果我们要读入两行字符的话,需要手动将这个换行符处理掉。

65320

泛型和元编程的模型:Java, Go, Rust, Swift, D等

我将描述三种不同的完全通用的元编程方法,看看它们是如何在泛型系统空的不同方向进行扩展:像Python这样的动态语言,像Template Haskell这样的过程宏系统,以及像Zig和Terra这样的阶段性编译...反射 一旦你有了vtables,就可以让编译器也生成其他类型信息,字段名、类型和位置,这些都不困难。这样就可以用同样的代码访问一个类型的所有数据,而这些代码可以检查其他任何类型的数据。...下面是模板Haskell的一个例子。...Rust 泛型 下一种类型的单态化泛型,是在类型检查之后,把代码生成的过程再推进一步。上文提到用C++可以像动态类型语言中的获取泛型库函数内的错误类型,这是因为模板参数基本只有一种类型。...这就是泛型在Rust的工作方式,在语言层面来说也是Swift和Haskell泛型的工作方式。

3K30

又要头秃?2020年七大AI编程语言大盘点

作者 | Claire D 译者 | 苏本,编辑 | 伍杏玲 来源 | CSDN(ID:CSDNnews) 人工智能已成为我们日常生活不可或缺的一部分,它被广泛地应用到几百种实际场景,极大地便利人们的工作和生活...Haskell发布于1990年,以著名数学家Haskell Brooks Curry的名字命名,它是一种纯函数式和强静态类型的编程语言,经常和延迟计算和较短的代码搭配使用。...Haskell被认为是一种非常安全的编程语言,与其他编程语言相比,它在错误处理方面提供了更大的灵活性。在Haskell很少发生错误。...Julia源代码的目录结构 Julia提供的下列特性,使其在人工智能编程、机器学习、统计和数据建模成为一个不可或缺的选项: 动态类型系统 内置的包管理器 能够进行并行和分布式计算 宏和元编程能力 支持多个调度...每一种人工智能编程语言都有各自的优缺点。 随着这些语言的不断改进,很快人工智能的开发就会变得比现在更加轻松和高效,更多人就可以加入到这股创新浪潮来。

1.7K20
领券