Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 频率树_List_Haskell_Tree_Bit_Frequency - Fatal编程技术网

List 频率树

List 频率树,list,haskell,tree,bit,frequency,List,Haskell,Tree,Bit,Frequency,我目前正在复习编程考试(我是编程新手),我遇到了一个练习,要求我实现一个函数,“将频率树和位列表转换为频率树中的值,并返回列表中的剩余位” 我无法理解的部分是我收到的类型: 频率树a->[bit]->(a[bit]) (a,[bit])实际上是什么意思?a只是一个值吗 感谢堆类型(a,b)是一个元组或元组对,包含a和b。在Haskell中,小写类型实际上是类型变量或未知数。如果它们写在一个类型中,则意味着该类型与变量所表示的实际类型是不变的 如果我们仔细阅读此函数的描述,我们可以看到它反映了以下

我目前正在复习编程考试(我是编程新手),我遇到了一个练习,要求我实现一个函数,“将频率树和位列表转换为频率树中的值,并返回列表中的剩余位”

我无法理解的部分是我收到的类型:

频率树a->[bit]->(a[bit])

(a,[bit])实际上是什么意思?a只是一个值吗

感谢堆类型
(a,b)
是一个元组或元组对,包含
a
b
。在Haskell中,小写类型实际上是类型变量或未知数。如果它们写在一个类型中,则意味着该类型与变量所表示的实际类型是不变的

如果我们仔细阅读此函数的描述,我们可以看到它反映了以下类型:

将频率树和位列表转换为频率树中的值,并返回列表中的剩余位

函数类型,如

a -> b -> c
可以作为函数从
a
和a
b
读取到a
c
。事实上,为了进一步巩固
的概念,我们可以编写一个类型相同的函数

(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
for
a

 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])真的有意义吗?它真的给了我想要的吗?