List 频率树
我目前正在复习编程考试(我是编程新手),我遇到了一个练习,要求我实现一个函数,“将频率树和位列表转换为频率树中的值,并返回列表中的剩余位” 我无法理解的部分是我收到的类型: 频率树a->[bit]->(a[bit]) (a,[bit])实际上是什么意思?a只是一个值吗 感谢堆类型List 频率树,list,haskell,tree,bit,frequency,List,Haskell,Tree,Bit,Frequency,我目前正在复习编程考试(我是编程新手),我遇到了一个练习,要求我实现一个函数,“将频率树和位列表转换为频率树中的值,并返回列表中的剩余位” 我无法理解的部分是我收到的类型: 频率树a->[bit]->(a[bit]) (a,[bit])实际上是什么意思?a只是一个值吗 感谢堆类型(a,b)是一个元组或元组对,包含a和b。在Haskell中,小写类型实际上是类型变量或未知数。如果它们写在一个类型中,则意味着该类型与变量所表示的实际类型是不变的 如果我们仔细阅读此函数的描述,我们可以看到它反映了以下
(a,b)
是一个元组或元组对,包含a
和b
。在Haskell中,小写类型实际上是类型变量或未知数。如果它们写在一个类型中,则意味着该类型与变量所表示的实际类型是不变的
如果我们仔细阅读此函数的描述,我们可以看到它反映了以下类型:
将频率树和位列表转换为频率树中的值,并返回列表中的剩余位
函数类型,如
a -> b -> c
可以作为函数从a
和ab
读取到ac
。事实上,为了进一步巩固和
的概念,我们可以编写一个类型相同的函数
(a, b) -> c
重复元组类型应理解为“and”的想法。这种转换称为curry
curry :: (a -> b -> c) -> ((a, b) -> c)
curry f (a, b) = f a b
使用这个概念,函数的描述转换为
(FreqTree, ListOfBits) -> (ValueInFreqTree, ListOfRemainingBits)
take
a frequency tree *and* list of bits
to
a value in the Frequency tree *and* the remaining bits in a list
从这里开始,我们只需对给定的类型进行一点模式匹配
(FreqTree , ListOfBits) -> (ValueInFreqTree, ListOfRemainingBits)
FreqTree -> ListOfBits -> (ValueInFreqTree, ListOfRemainingBits)
FreqTree a -> [bit] -> (a , [bit] )
上面的第一步与curry
相反,称为uncurry
,第二步将我们预期的类型与给定的类型进行比较。在这里,我们可以看到一些良好的位奇偶校验列表映射到[bit]
,而FreqTree
映射到FreqTree a
所以最后一点是找出类型变量a
是如何工作的。这需要理解参数化类型FreqTree a
的含义。因为频率树可能包含任何类型的东西,而不关心它的特定形式,只关心计算频率的能力,所以最好通过它的值来参数化类型。你可以写信
FreqTree value
其中,小写名称表示类型变量。事实上,我们也可以在前面的类型中进行这种替换,value
fora
FreqTree value -> [bit] -> (value, [bit])
现在,也许这种类型已经有了最清晰的形式。给定一个
FreqTree
包含标记为value
的未知类型和一个bit
列表,我们返回一个特定的value
,另一个bit
列表是在树中找到的值。FreqTree a->[bit]>(a,[bit])
实际上是指所有位的。频率树a->[bit]->(a[bit])
。在haskell中,类型中的任何小写标识符都是类型变量,通常可以被任何类型替换。但是我认为你有一个输入错误,你可能是指FreqTree a->[Bit]->(a[Bit])
其中Bit
是一些数据类型,比如Bool
或data Bit=I | O
,这会更有意义。是的,谢谢!对不起,我指的是数据类型Bit=1 | 0。但是如何表示列表中的剩余位呢?它是否类似于x:xs,剩余的位将是xs?是的。如果xs==h++t
,并且从h
读取类型为a
的值v
,则t
为剩余位。e、 g.[1,2,3,4,5]->(123,[4,5])
@WillNess那么,如果我写了这样的东西,有意义吗:`(freqtree a,[x])->(a,[xs])?我仍然不知道函数实际返回什么…我实现了类似于(Leaf_a,[x])->(a,[xs的东西。(a,[xs])真的有意义吗?它真的给了我想要的吗?