Text
Text.Parsec
Text.Parsec.ByteString
Text.Parsec.ByteString.Lazy
Text.Parsec.Char
Text.Parsec.Combinator
Text.Parsec.Error
Text.Parsec.Expr
Text.Parsec.Language
Text.Parsec.Perm
Text.Parsec.Pos
Text.Parsec.Prim
Text.Parsec.String
Text.Parsec.Token
ParserCombinators
Text.ParserCombinators.Parsec
Text.ParserCombinators.Parsec.Char
Text.ParserCombinators.Parsec.Combinator
Text.ParserCombinators.Parsec.Error
Text.ParserCombinators.Parsec.Expr
Text.ParserCombinators.Parsec.Language
Text.ParserCombinators.Parsec.Perm
Text.ParserCombinators.Parsec.Pos
Text.ParserCombinators.Parsec.Prim
Text.ParserCombinators.Parsec.Token
Run Code Online (Sandbox Code Playgroud)
它们是一样的吗?
使用存在类型时,我们必须使用模式匹配语法来提取foralled值.我们不能将普通记录选择器用作函数.GHC报告错误并建议使用与以下定义的模式匹配yALL:
{-# LANGUAGE ExistentialQuantification #-}
data ALL = forall a. Show a => ALL { theA :: a }
-- data ok
xALL :: ALL -> String
xALL (ALL a) = show a
-- pattern matching ok
-- ABOVE: heaven
-- BELOW: hell
yALL :: ALL -> String
yALL all = show $ theA all
-- record selector failed
Run Code Online (Sandbox Code Playgroud)
forall.hs:11:19:
Cannot use record selector `theA' as a function due to escaped type variables
Probable fix: use …Run Code Online (Sandbox Code Playgroud) 举一个丑陋的例子:
data Bighead = Big
little = 1
f1 = little :: Int
f2 = Big :: BigHead
Run Code Online (Sandbox Code Playgroud)
在我看来:
f1并且f2都指向一些数据.唯一不同的(little和Big)很少有一段代码来做评估.但是Big没有.
它们都有一个可重写的主体,很少可以从一组数据转换为结果,而Big只是不做最后一步---它总是保存这些数据形式(但递归地可以评估它们).
但是在语法形式上,它们几乎相同:可以应用,可以进行评估.
一个重要的事情可能是函数无法改变其应用的参数,但数据可以做到.
这是Haskell以不同方式处理数据和函数名称的唯一原因吗?
征集分析:-)
编辑:更多的垫
data A = B Int
Run Code Online (Sandbox Code Playgroud)
类型B:
B :: Int -> A
b :: Int -> A
b = B
Run Code Online (Sandbox Code Playgroud) 我对CPU缓存和物理地址之间的"别名"的含义感到有些困惑.首先,我在维基百科上找到了它的定义:
但是,VIVT会遇到别名问题,其中几个不同的虚拟地址可能引用相同的物理地址.另一个问题是同音异义词,其中相同的虚拟地址映射到几个不同的物理地址.
但过了一段时间,我在DAC'05 的演示文稿(ppt)中看到了不同的定义:"具有虚拟内存的嵌入式处理器的节能物理标记缓存"
缓存别名和同义词:
别名:来自不同上下文的相同虚拟地址映射到不同的物理地址同义词:映射到同一物理地址的不同虚拟地址(数据共享)
由于我不是母语,我不知道哪个是正确的,尽管我觉得Wiki的定义是正确的.
编辑:
CPU缓存中"混叠"的概念通常表示"同义词",相反是"谐音".在更通用的层面上,"别名"是"令人困惑"或"混乱"或类似的东西.所以在我看来,"混叠"恰恰意味着(X-> Y)的映射是"不是双射的",其中
"X"=已缓存的物理地址单元的子集.(每个元素是一行字节)
"Y"=有效缓存行的集合.(元素也是"线")
约束(Stream s Identity t)在以下类型声明中意味着什么?
parse :: (Stream s Identity t)
=> Parsec s () a -> SourceName -> s -> Either ParseError a
Run Code Online (Sandbox Code Playgroud)
什么是Stream在下面的类的声明,这是什么意思.我完全迷失了.
class Monad m => Stream s m t | s -> t where
Run Code Online (Sandbox Code Playgroud)
当我使用Parsec时,我总是遇到带有type-signature(xxx :: yyy)的卡纸.我总是跳过签名,将src加载到ghci,然后将类型签名复制回我的.hs文件.它有效,但我仍然不明白所有这些签名是什么.
编辑:更多关于我的问题.
我仍然对类型签名的"上下文"感到困惑:
(Show a) =>
Run Code Online (Sandbox Code Playgroud)
意味着a必须是一个类的实例Show.
(Stream s Identity t) =>
Run Code Online (Sandbox Code Playgroud)
这种"背景"的含义是什么,因为t从未在此之后展示过=>
我有很多不同的解析器要运行,所以我编写了一个warp函数来运行任何带有真实文件的解析器.但问题出现了:
这是我的代码,它无法加载,我怎样才能使它工作?
module RunParse where
import System.IO
import Data.Functor.Identity (Identity)
import Text.Parsec.Prim (Parsec, parse, Stream) …Run Code Online (Sandbox Code Playgroud) 当我阅读关于调度程序的GHC Wiki评论时,我对此部分感到困惑:
将Capability标记为免费的一个原因是支持快速标注.在进行安全的外部调用时,我们必须释放Capability,然后将其移交给另一个工作线程.如果外国呼叫很短,我们不希望在返回时产生上下文切换的成本,但由于我们将能力标记为空闲,因此返回的任务很可能立即重新获取并继续.我们醒来的工作人员会发现Capability已经拥有,然后再次进入休眠状态 (如果没有可用于运行该工作线程的空闲CPU,则可能会产生双上下文切换).
我的问题:
对于大胆的句子,确实会导致"双上下文切换",无论是否标记自由的能力.此外,如果它们发生的话,两个"开关"是什么 - 从who1到who2,然后who2到who3?
这是LLVM文档"langref"中的文本:
"cc 10" - GHC会议
此调用约定已专门用于格拉斯哥Haskell编译器(GHC).它通过寄存器传递所有内容,通过禁用被调用者保存寄存器来达到极限.这种调用约定不应该被轻易使用,而是仅用于特定情况,例如在实现函数式编程语言时经常使用的寄存器固定性能技术的替代方法.目前只有X86支持这种约定,它具有以下限制:
- 在X86-32上,最多只支持4位类型参数.不支持任何浮点类型.
- 在X86-64上,最多只支持10位类型参数和6个浮点参数.
问:
"寄存器固定"是指或者指的是"将寄存器中的所有内容传递".
什么是"4位型参数"?我刚刚在英特尔的IA手册中搜索过,但没有找到任何东西.它是英特尔CPU的一个特色吗?
与(大多数)RISC arch不同,x86指令具有可变长度.指令的开始/结束不必对齐.如果编译器没有一条指令可能只是在页面边缘上.
假设如果指令的第一个字节位于页面的最后一个字节,则标记为可执行文件.指令的其余字节位于第二页,标记为不可执行.
在这种情况下,执行到达此指令时CPU会发生什么?
编译器需要关心这种情况吗?
我正在Haskell中编写一些程序,处理很多基本类型,如Word32/Word64等.我使用ghci来频繁地测试函数,在终端中查看结果.
为方便快捷,我总是以十六进制显示数据,例如
data Human = M Int | F Int
instance Show Human where
show M x = printf "man, age %d" x
show F x = printf "woman, age %d" x
Run Code Online (Sandbox Code Playgroud)
但我希望基本类型以十六进制显示(特别是在ghci中).我发现实例声明无法覆盖.而且我不想像他们一样扭曲所有人:
newtype MyInt = MyInt Int
instance Show MyInt where
...
Run Code Online (Sandbox Code Playgroud)
它看起来有点愚蠢.
我可以修改baseghc 包中的一些代码吗?我只想让一切都变成"十六进制".我只想要ghci显示"hex".我怎么能实现它?
由于我们所有人都同意覆盖Show不合适且不切实际,因此欢迎 任何"更好地以十六进制显示ghci中的数字"的答案.
我想要一个 bash 函数来计算显示时所消耗的字符串宽度。\n因为在我的情况下,字符串可能包含一些宽字符(例如中文)。所以我不能只使用字符串的长度。
\n\nfunction getDisplayWidth ()\n{\n ???\n}\nRun Code Online (Sandbox Code Playgroud)\n\n那么“abc”将返回 3\n,“\xe5\x89\x8d\xe5\x90\x8e”应该返回 4 而不是 2。
\n