我有一个函数,在给定数据类型的情况下输出类似booleanlike的属性.此函数通过模式匹配在数据类型的第一个构造函数上计算属性,所以类似于
data C = C1 | C2 | .. | Cn
f :: C -> Bool
f (C1 _ _ ... _) = True
f (C2 _ _ ... _) = True
f (C3 _ _ ... _) = False
.
.
.
f (Cn _ _ ..._) = False
Run Code Online (Sandbox Code Playgroud)
是否有更紧凑的方式来执行模式匹配,还是有另一种(也更紧凑)的方式来进行我的财产检查?我不想将属性添加到数据类型定义中,因为它可以相对容易地计算.
我正在研究NP搜索问题,并被告知我可以通过使用所述包加快搜索过程.由于回忆对我来说是一个新概念,我发现除了"标准"记忆的斐波那契序列之外,我很难将其包围起来.
为了将数据类型'a'实例化为Memoizable,我需要在其上定义一个函数memoize(::(a-> v) - > a - > v).
我有一个数据类型数据公式在类(Eq,Ord,Show)中.我将不得不定义自己的实例声明,但不知道预期的功能.
这个函数究竟应该为memoisation定义什么?包描述没有详细说明,我怀疑功能应用程序(适合类型签名)将加速任何事情.
在未能构建我自己的memoization表之后,我转向了所述类并尝试使用它来加速Fibonacci序列的双递归定义:
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
Run Code Online (Sandbox Code Playgroud)
我曾尝试过memoize几种方式使用该类的功能,但即使是下面的结构看起来也很慢(吃10秒fib 33):
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = memoize fib (n-1) + memoize fib (n-2)
fib' :: Int -> Int
fib' n = memoize fib n
Run Code Online (Sandbox Code Playgroud)
我尝试过memoize以其他方式进行分发,但性能似乎没有提高.我知道有其他方法来解决这个问题,特别是计算得更有效,但对于我原来的问题,我想使用Memoize包.所以我的问题是,如何通过memoize此包中的功能提高性能?
我正在编写一段代码,通过吃掉包含输入元素的列表来产生大量结果.说[i1,i2,i3,i4]
产生结果的函数将以所有可能的方式组合前两个:o1,o2和o3,并用此计算的结果替换输入:
[[o1,i3,i4],[o2,i3,i4],[o3,i3,i4]]
从现在开始,我希望依靠递归来生成单个列表的列表,这些列表是组合输入的结果,但我仍然在应对任意嵌套列表时遇到问题,很可能是因为我正在寻求映射输出回到这种(某种)功能:
tides :: [a] -> [a]
tides (i1:i2:is) = map tides ((makeResult i1 i2):is)
tides [] = []
Run Code Online (Sandbox Code Playgroud)
- 其中makeResult产生所述输出
这不起作用,我相信我不会发现这样的工作功能.描述这种递归的正确方法是什么?