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

Haskell:如何获取具有多个参数的数据类型的类型(如` `Path a b= ..`

在Haskell中,可以使用TypeApplications扩展来获取具有多个参数的数据类型的类型。TypeApplications允许我们在函数或表达式中显式地指定类型参数。

对于具有多个参数的数据类型,例如Path a b = ...,我们可以使用TypeApplications来获取其类型。以下是一个示例:

代码语言:txt
复制
{-# LANGUAGE TypeApplications #-}

data Path a b = Path a b

getPathType :: Path a b -> (a, b)
getPathType _ = (undefined @a, undefined @b)

在上面的代码中,我们定义了一个具有两个参数的数据类型Path a b。然后,我们定义了一个函数getPathType,它接受一个Path a b类型的参数,并返回一个包含类型ab的元组。

getPathType函数中,我们使用TypeApplications扩展来显式地指定类型参数。通过使用undefined @aundefined @b,我们可以获取Path a b的类型,并将其作为元组的一部分返回。

请注意,undefined在这里只是为了获取类型信息,并且在实际使用时应该被替换为具体的值。

对于上述问题,腾讯云没有直接相关的产品或链接地址。但是,腾讯云提供了广泛的云计算服务,包括计算、存储、数据库、人工智能等领域。您可以访问腾讯云官方网站以了解更多信息。

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

相关·内容

如何理解java方法传值和传引用参数传递方式(基本数据类型和引用类型)

大家好,又见面了,我是你们朋友全栈君。...结论: 1)当使用基本数据类型作为方法形参时,在方法体中对形参修改不会影响到实参数值 2)当使用引用数据类型作为方法形参时,若在方法体中 修改形参指向数据内容,则会对实参变量数值产生影响,...因为形参变量和实参变量共享同一块堆区; 3)当使用引用数据类型作为方法形参时,若在方法体中 修改形参变量指向,此时不会对实参变量数值产生影响,因此形参变量和实参变量分别指向不同堆区 例一:基本数据类型作为形参...return this.age; } public void setAge(int age) { this.age = age; } } 例二:引用类型...this.name[1]; } public void setName(String[] name) { this.name = name; } } 例三:引用类型

1.8K30
  • 从惰性IO说起_Haskell笔记6

    ByteString看着像个新数据类型,但我们不是已经有String了吗?...List,就像'a' : 'b' : 'c' : []“承诺”会有一个'a'开头List,这个List有多长,占多少空间,在真正需要求值之前都是未知(也没必要知道,所以允许存在无限长List,而不用担心如何存储问题...相关函数,见Data.ByteString 三.命令行参数 除交互输入和读文件外,命令行参数是另一种获取用户输入重要方式: -- readWhat.hs import System.Environment...其中getArgs类型是: getArgs :: IO [String] 位于System.Environment模块,以为I/O Action形式返回命令行参数组成String数组,类似的还有:...)]只限定了random3返回类型,编译器能够推断出random $ mkStdGen i所需类型是(Bool, StdGen) 这下有点(伪)随机意思了,因为random是个纯函数,所以只能通过换种子参数来得到不同返回值

    2.3K30

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

    作为一门函数编程语言,主要控制结构是函数; Haskell具有 “证明即程序、命题为类型特征; 这些概念起初可能看起来空泛,但回过头来看:“它还真就是这样!”...注:我们使用命令 :t 来查看类型Haskell 常用数据类型有: Bool 布尔类型只有 True 和 False 两个值,注意大小写;同样支持“或与非”运算: True||False True...函数类型是本篇重中之重,前面的可以随意看看,但是从此节开始请务必细究。 函数可以理解为从参数到结果一个映射,比如T1 -> T2。...我们在下一小节做更为细致说明“类型类”~ 类型别名 一个数据类型可以由多个其他类型组成,在 Haskell 中,可以用 type 关键字将这些复杂类型替换成为其他简单名字; Prelude>...强类型:可以帮助我们检查错误、对程序进行抽象(函数式编程关键)、具有文档说明作用。

    94930

    为什么 Haskell 是我们构建生产软件系统首选

    例如,a -> b -> a 签名告诉我们这个函数接收两个任意类型参数,并返回一个类型与第一个参数相同值。假设我们要检查一个元素是否在某个列表中。...(例如,具有给定参数列表函数调用)属性。...5Haskell 非常适合域建模和防止域逻辑错误 Haskell 类型系统除了简单编译时类型检查之外还有一个好处,那就是它可以在应用程序中使用自定义数据类型来对问题域进行建模。...这使程序员可以创建由类型系统强制执行业务逻辑规则描述。Haskell 具有所谓代数数据类型(ADT),由 record(product 类型)和 tagged union(sum 类型)组成。...在具有可变值语言中,多个线程访问相同值可能导致诸如条件争用和死锁之类问题。 由于 Haskell值是不可变,因此即使程序在多个线程上运行并访问共享内存,也不会出现这类问题。

    1.4K10

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

    我将描述三种不同完全通用元编程方法,看看它们是如何在泛型系统空不同方向进行扩展:像Python这样动态语言,像Template Haskell这样过程宏系统,以及像Zig和Terra这样阶段性编译...有两个基本想法,一是想办法让所有数据类型在我们数据结构中有同样行为方式,二是对我们数据结构进行多份拷贝,并稍作调整,以特定方式处理每种数据类型。...单态化 另一种泛型实现方法是单态化。在这种方式中,需要找到某种方法来为每种类型输出多个版本代码。编译器在编译时,代码会经过多个表达阶段,理论上我们可以在其中任何一个阶段进行复制。...在C++和D中使用模板使用这种方式,你可以在类型和函数上指定 "模板参数",当你实例化一个具有特定类型模板时,该类型会被替换到函数中,然后对函数进行类型检查,以确保组合是有效。...上文提到用C++可以像动态类型语言中获取泛型库函数内错误类型,这是因为模板参数中基本只有一种类型

    3K30

    Haskell 自定义type与typeclass

    自定义type Part One Haskell中使用data关键字来定义新数据类型: data BookInfo = Book Int String [String] deriving (Show)...v type IntMap = Map Int algebraic data type Bool类型是代数数据类型一个典型代表,一个代数类型可以有多个值构造器 data Bool = False|...data Maybe a = Nothing | Just a -- Defined in ‘GHC.Maybe’ 递归定义 一个代数数据类型值构造器可以有多个field,我们能够定义一个类型...这有点像函数,也是接收一个值作为参数并回传另一个值。对于类型如何被套用到泛型上,我们看下正式定义。 像是3,"abc"或者是takeWhile值都有自己类型(函数也是值一种)。...我们可以在ghci中通过:k来获取一个类型kind: Prelude> :k Int Int :: * *代表这个类型是具体类型。一个具体类型是没有任何类型参数,值只能属于具体类型

    7010

    newtype_Haskell笔记8

    除此之外,就与data关键字没什么区别了 P.S.关于值构造器与参数,见类型_Haskell笔记3 三.对比type和data 关键字 作用 应用场景 data 定义自己(数据)类型 想要定义完全新类型...type 给现有类型起别名,得到东西完全等价于原类型,可无条件换用/混用 想让类型签名更清楚(语义化)时候 newtype 将现有的类型包成一个新类型,得到类型与原类型不同,不能换用/混用 想让现有类型具有一种不同接口...关键字定义数据类型可以有多个值构造器,即便只声明了一个,它也要找过才知道。...它明确约定了只有一个值构造器(并且这个值构造器只有一个参数),不妨试一下: newtype MyTuple a b = MyTuple {getTuple :: (a, b)} > sayHello (...MyTuple _) = "hh" > sayHello undefined "hh" 确实如此,Haskell足够聪明,明确知道不存在多个值构造器时,不再做无谓计算 参考资料 48 newtype

    61230

    铁定不纯IO_Haskell笔记5

    写在前面 一直有个疑惑,Haskell号称纯函数式语言,那么铁定不纯场景(肯定有副作用,或者操作本身就是副作用)如何解决?...场景,mapM第一个参数是输入a输出IO b函数,第二个参数是[a],返回IO [b],返回值类型与sequence一致。...)也可以,但出于语义习惯,forM常用于定义I/O Action场景(根据[a]生成IO [b]) forever Control.Monad.forever :: Applicative f =>...,再输出出来,这个指针果然是能移动 P.S.类似的hGet/Putxxx含有很多,比如hPutStr, hPutStrLn, hGetChar等等,与不带h版本类似,只是多个handle参数,例如:...(第3个参数),最后再把handle关掉: withFile' path mode f = do handle <- openFile path mode result <- f handle hClose

    1.3K30

    为何 Go 声明语法有点怪?(语法比较)

    看下函数: func foo(a int, b *int) string 这和 C 感觉也没有多大差别,而且从左向右读起来也很顺畅。 参数是函数和返回值是参数情况呢?...Haskell 语法是与自身为纯函数式编程语言分不开Haskell 不使用括号这种具有边界性质符号来界定参数,而是使用 -> 开放形式来声明,返回值与入参一样,都是用-> 串起来,使得声明看起来非常一致...Haskell 是强类型语言,但是带了一个很强大类型推导系统,我们在声明变量时不需要指定变量类型,编译器会根据初始化数据或函数返回值等来判断参数类型,另一方面,Haskell是函数式编程语言,我们声明类型都是...我们入参是一个整数,返回值也是一个整数,从左到右很清晰,如果我们入参、返回值是函数如何呢?...回过头来我们再看一下 Haskell 函数声明语法a -> b -> c,其实这里面没有什么入参、返回值区别,函数从左到右接收参数,返回值就是最后参数后面的部分,也就是说我们提供了一个参数a,返回就是

    1.6K40

    再谈编程范式—程序语言背后思想

    函数式编程特性 函数是"一等公民":函数优先,和其他数据类型一样。...偏应用函数(Partially Applied Functions):一个函数接收一个有多个参数函数,返回一个需要较少参数函数。...偏函数将一到多个参数在内部固定,然后返回新函数,返回函数接收剩余参数完成函数应用。 柯里化(Currying):输入一个有多个参数函数, 返回一个只接收单个参数函数。...在函数式编程语言中可以定义代数数据类型(Algebraic data type),通过组合已有的数据类型形成新数据类型,如在Scala中提供case class,代数数据类型值可以通过模式匹配进行分析...除C++之外,C#,Java,Haskell等编程语言都引入了泛型概念。 泛型编程是一个稍微局部一些概念,它仅仅涉及如何更抽象地处理类型,即参数类型。这并不足以支撑起一门语言核心概念。

    1.7K20

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

    有一个特殊幺元,能够和任何元素组合,导致结果是不改变这些元素。 函子到底是什么? 一个函子Functor是任意类型,这些类型定义了如何应用 map (fmap in Haskell) 。...也就是说,如果我们要将普通函数应用到一个有盒子上下文包裹值,那么我们首先需要定义一个叫Functor数据类型,在这个数据类型中需要定义如何使用map或fmap来应用这个普通函数。...image.png fmap输入参数是a->b函数,在我们这个案例中是(+3),然后定义一个函子Functor,这里是HaskellJust 2,最后返回一个新函子,在我们案例中,使用Haskell...函数identity是一个自函数特例,它接收什么参数就返回什么参数,所以入参和返回值不仅类型一致,而且值也相同。...List具有map方法,不妨看看map定义: f :: A -> B map :: f -> List[A] -> List[B] 具体到我们例子当中,就有: f :: Int -> String

    4.3K30

    Elasticsearch 6.x版本全文检索学习之倒排索引与分词、Mapping 设置

    c、定义倒排索引相关配置,比如是否索引,记录position等等。 如何获取到一个索引Indexmapping呢,如下所示: ?...更多参数详见官网文档即可。 17、Elasticsearch数据类型。 1)、核心数据类型(字段field对应类型type)。...a、数组类型array。 b、对象类型object。 c、嵌套类型nested object。 3)、地理位置数据类型。 a、geo_point。...a、match_mapping_type匹配es自动识别的字段类型boolean、long、string等等。 b、match,unmatch匹配字段名。...c、path_match,path_unmatch匹配路径。 3)、字符串默认使用keyword类型。es默认会为字符串设置为text类型,并增加一个keyword子字段。

    1.7K30

    再谈编程范式-程序语言背后思想

    函数式编程特性 函数是"一等公民":函数优先,和其他数据类型一样。...偏应用函数(Partially Applied Functions):一个函数接收一个有多个参数函数,返回一个需要较少参数函数。...偏函数将一到多个参数在内部固定,然后返回新函数,返回函数接收剩余参数完成函数应用。 柯里化(Currying):输入一个有多个参数函数, 返回一个只接收单个参数函数。...在函数式编程语言中可以定义代数数据类型(Algebraic data type),通过组合已有的数据类型形成新数据类型,如在Scala中提供case class,代数数据类型值可以通过模式匹配进行分析...除C++之外,C#,Java,Haskell等编程语言都引入了泛型概念。 泛型编程是一个稍微局部一些概念,它仅仅涉及如何更抽象地处理类型,即参数类型。这并不足以支撑起一门语言核心概念。

    1.5K40

    【译】设计优雅 Rust 库 API

    RFC 344 定义了一些有意思约定,比如: 如何在方法名称中引用类型名称( &mut [T] 变成 mut_slice、*mut T 变成 mut ptr), 如何命名返回迭代器方法, getter...这种情况下就需要使用 FromStr triat 了,它抽象了 “解析字符串到 Rust 数据类型行为。...之前去掉泛型 open_impl(path.as_ref()) } 惰性 尽管 Rust 不能像 Haskell 一样对表达式进行惰性计算,但是你仍然可以使用一些技术来优雅地省略不必要计算和分配...装饰结果 Florian 在 “Decorating Results” 中写到,你可以使用这种方法来编写并实现 trait 来为内置类型 Result 实现自己方法。...每个状态都有不同类型。 每个状态类型都实现了不同方法。 一些方法会消耗这个状态类型获取所有权)并且返回另一个状态类型

    1.7K30

    解决 JavaScript 中处理 null 和 undefined 麻烦事

    注意:你可能想知道为什么我要用字符串而不是数字来举例,那是因为用大数字符串来表示货币类型具有十进制精度,可以避免舍入错误,并准确地表示加密货币交易值,这样可以得到任意有效十进制精度。...换句话说,JavaScript 中数组可以填补 Haskell 等语言中 Maybe 角色。 什么是Maybe? Maybe 是一种特殊抽象数据类型,它封装了一个可选值。...你可以围绕 Maybe 建立一个有用函数完整库去实现其他操作, flatMap 和 flat(在编写多个 Maybe 返回函数时,避免使用 Just(Just(value)) )。...但是 JavaScript 已经有了一种数据类型,该数据类型可以直接实现这些功能,它就是数组。 如果你要创建一个可能会也可能不会产生结果函数(尤其是可能有多个结果),则下面是一个很好例子。...我们可以用 JavaScript Array 数据类型做同样事: 1// maybe = b => (a => b) => [a] => b 2const maybe = (fallback,

    1.2K20
    领券