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

Haskell为什么使用@ (as)

Haskell使用@符号(as符号)的主要目的是为了在模式匹配或导入语句中进行名称重命名。它提供了一种简洁且易于理解的方式来引入或重命名已存在的标识符。

在模式匹配中,@符号可以用于将模式的一部分绑定到一个新的变量,同时保留原始模式的匹配。这使得我们能够在模式匹配的同时对匹配的部分进行处理或引用。例如:

代码语言:txt
复制
foo :: [Int] -> String
foo xs@(x:_) = "The first element is: " ++ show x ++ " and the rest are: " ++ show xs
foo _ = "Empty list"

-- 使用示例
main :: IO ()
main = do
  putStrLn $ foo [1, 2, 3]  -- 输出:The first element is: 1 and the rest are: [1, 2, 3]
  putStrLn $ foo []         -- 输出:Empty list

在上面的例子中,模式xs@(x:_)将整个列表绑定到变量xs,同时将列表的第一个元素绑定到变量x。我们可以在函数体中使用xs来引用整个列表,使用x来引用第一个元素。

在导入语句中,@符号可以用于重命名导入的模块或模块中的函数、类型等。这可以避免命名冲突或简化访问模块中的内容。例如:

代码语言:txt
复制
import Data.List as L
import Data.Map as M

-- 使用示例
main :: IO ()
main = do
  putStrLn $ show $ L.sort [3, 1, 2]      -- 输出:[1, 2, 3]
  putStrLn $ show $ M.fromList [("a", 1), ("b", 2)]  -- 输出:fromList [("a",1),("b",2)]

在上面的例子中,import Data.List as LData.List模块导入,并将其命名为L,这样我们就可以使用L.sort来调用Data.List模块中的sort函数。类似地,import Data.Map as MData.Map模块导入,并将其命名为M,我们可以使用M.fromList来调用Data.Map模块中的fromList函数。

总结起来,Haskell中的@符号用于模式匹配和导入语句中的名称重命名。它提供了一种简洁明了的方式来引入或重命名标识符,以便更好地理解和处理代码。

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

相关·内容

Haskell

Haskell是一种标准化的、通用纯函数式编程语言,有非限定性语义和强静态类型,在Haskell中,函数是一等公民。...ghc包含了三个主最要的部分: ghc 编译器 ghci 交互式解析器和调试器 runghc 以脚本的方式运行Haskell 而我们即将学习的起点就是在ghci中来练习Haskell的基本语法。...Haskell每一个函数都非常颗粒度,来解决很小的问题,如果我们无法理解这种很小的颗粒度,根本很难从小组合到强大的处理流程。是的,这就是Haskell。...(注明:本文不是投资建议,仅仅是从Haskell引发出来的Cardano项目) 是的,Cardano就是用Haskell来编写的,(我这样的渣渣也仅仅是阅读和学习)Haskell的用户大部分都是教授或者是数学领域的牛人...回归语言Haskell,函数式的编程其实有一点上,大家都很清楚,用很少的代码来完成一件事情。Haskell还可以定义跟数学的过程一一对应,这就很有意思了。

85930
  • Haskell 基础

    Prelude> doubleMe 10 20 tip: 如果修改doubleMe.hs文件需要重新导入的话可以执行:reload doubleMe.hs或者:r doubleMe.hs重新导入 if语句 Haskell...中的if语句与其他语言不同,else是不可以省略的 doubleSmallNum x = if x > 10 then x else x * 2 Haskell 中的 if 语句的另一个特点就是它其实是个表达式...Prelude> 't' : "his is string" this is string Prelude> "this is" ++ " string" this is string 操作 从list中取值使用...1 2 上面的例子就是从列表l中取下标为1的元素 list可以用来装list: Prelude> let l = [[1,2,3], [1,2,3,4], [1,2,3,4,5]] haskell不要求每个元素的长度一致...[1,2,3] [3,2,1] Prelude> take 2 [1,2,3] [1,2] Prelude> 1 `elem` [1,2,3] True Range 可以用列表符号来表示一系列元素,haskell

    6810

    模块_Haskell笔记2

    保留命名空间来避免冲突 GHCi环境 通过:m命令引用模块: > :m Data.List > :m Data.List Data.Map Data.Set GHC 7.0之后,支持在GHCi环境直接使用...或者不暴露值构造器,仅允许通过工厂方法等方式获取该类型值(常见的比如Map.fromList): module MyModule (Tree, factory) 缺点是,这样做就无法使用值构造器进行模式匹配了...Data.Map 字典是键值对的无序列表,以平衡二叉树的形式存储,Data.Map提供了一些字典处理函数 P.S.Data.Map中的一些函数与Prelude和Data.List模块存在命名冲突,所以使用...Set.fromList 集合去重效率高于List.nub,但缺点是构造集合会对元素进行排序,所以得到的去重结果不保留原顺序(List.nub会保留) 参考资料 Haskell/Modules Haskell

    1.7K30

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

    在这篇文章中,我将介绍 Haskell 的一些突出特性,这些特性让它成为一种出色的、具有行业水准的语言,从而非常适合构建商业软件;我还会解释为什么我们的新项目考虑使用的第一个工具往往就是它。...Haskell 的静态类型系统还带来了其他好处。Haskell 代码使用类型签名,位于其函数之前,并描述每个参数的类型和返回值。...检查我们的 AWS 使用率指标可以发现,Haskell 机器上的 CPU 甚至从未达到 5%使用率。Haskell 端点始终有着 100ms 或更短的响应时间,略胜于 PHP 端点。...Haskell 中支持 DSL 的函数之一称为 Template Haskell。很多库作者经常使用这个方法,以允许库的使用使用表达性语法来避免大量样板。...10结论 为什么 Haskell 是我们构建生产软件系统的首选编程语言呢?原因有很多。我们再来回顾一下这篇文章中列举的各个因素: Haskell 具有强大的静态类型系统,可以预防错误并减少认知负担。

    1.4K10

    Haskell Type与Typeclass

    > tip: 按照其他语言中的习惯,Int,Int,Int -> Int好像看起来更为恰当一些,但实际haskell中->只有一个作用:它标识一个函数接收一个参数并返回一个值,其中->符号左边是参数的类型...haskell中所有函数都是只接收一个参数的,所有函数都是currying的。...> tip: 与其他语言中的泛型generic很像 使用到类型变量的函数被称为“多态函数”。...Typeclass提供了判断相等性的接口,凡是可比较相等性的类型必定属于Eq class elem函数的类型为:(Eq a)=>a->[a]->Bool这是因为elem函数在判断元素是否存在于list中时使用到了..."True" || False True 但是执行下面的代码,就会提示错误: Prelude> read "5" *** Exception: Prelude.read: no parse 这是因为haskell

    6710

    Monad_Haskell笔记10

    P.S.关于computation context的详细信息,见Functor与Applicative_Haskell笔记7 用来解决context相关计算中的另一个场景:怎样把一个具有context的函数应用到具有...,因为默认所有的小写字母类型参数都是任意的: In Haskell, any introduction of a lowercase type parameter implicitly begins with...实际上,do表示法不仅能用于I/O场景,还适用于任何Monad 就语法而言,do表示法要求每一行都必须是一个monadic value,为什么呢?...>>= (\y -> Just (show x ++ y))) 所以<-的作用是: 像是使用>>=来将monadic value带给lambda一样 >>=有了,那>>呢,怎么用?...return (n,ch)) -- 加括号完整版 ([1, 2] >>= (\n -> (['a','b'] >>= (\ch -> return (n,ch))))) 函数体没界限就匹配到最右端,相关讨论见Haskell

    72750

    ubuntu 14.04 install haskell

    haskell是一种函数编程式语言,ghc是Glasgow Haskell Compiler的简称,也是Haskell Platform的基础....的一个package,提供Haskell包安装框架,类似python的easy_install、debian的apt-get等。...cabal-install是另一个Haskell包安装库,提供了cabal命令行程序,该程序在安装新包时会自动解决包依赖关系。...中包含这些包,但是由于使用apt-get安装时不能获得最新的版本或者会出现一些问题,比如network-2.6.0.2通过cabal总是安装不上,报编译错误 这种使用源码安装的方式很好的解决了这些问题。...在安装相关haskell包的时候可能会出现broken package错误,可以通过以下命令在haskell中移除broken package ghc-pkg check --simple-output

    71610

    newtype_Haskell笔记8

    Applicative实现,所以造出了ZipList,让它以拉链结对的方式实现Applicative P.S.这里提到的是Applicative类定义的行为,具体见Functor与Applicative_Haskell...除此之外,就与data关键字没什么区别了 P.S.关于值构造器与参数,见类型_Haskell笔记3 三.对比type和data 关键字 作用 应用场景 data 定义自己的(数据)类型 想要定义完全新的类型...想让类型签名更清楚(语义化)的时候 newtype 将现有的类型包成一个新的类型,得到的类型与原类型不同,不能换用/混用 想让现有类型具有一种不同的接口(typeclass)实现时 四.newtype与惰性计算 Haskell...的哪个值构造器,后者则不需要 但奇怪的是,Tuple明明只有一个值构造器(不需要“看应该用Tuple的哪个值构造器”): data () = () 我们知道没必要去检查应该用Tuple的哪个值构造器,但Haskell...MyTuple a b = MyTuple {getTuple :: (a, b)} > sayHello (MyTuple _) = "hh" > sayHello undefined "hh" 确实如此,Haskell

    61230

    基础语法_Haskell笔记1

    一.简介 Haskell是一种纯函数式语言(purely functional programming language),其函数式特性的纯度没有争议 命令式语言要求你提供求解的步骤,Haskell则倾向于让你提供问题的描述...二.基本运算 负数与一元减号 -3 表示对数字3使用一元运算符-,求得其相反数-3。...函数默认都是柯里化的,都只接受一个参数: In Haskell, all functions are considered curried: That is, all functions in Haskell...多行声明必须对齐缩进,否则编译器无法正确解析(不知道要定义的变量/函数列表结束了没) 子句中声明的变量和函数的作用域是当前函数及其guard,且不包括同名函数的其它模式 子句中可以用模式匹配 允许嵌套使用...(step),可以是负间隔(递减序列): > [1, 3..7] [1,3,5,7] > [10, 9..1] [10,9,8,7,6,5,4,3,2,1] 浮点数存在精度的问题,不建议在Range中使用

    1.9K30
    领券