小编Hax*_*aar的帖子

Haskell替代长模式匹配列表?

我有一个函数,在给定数据类型的情况下输出类似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)

是否有更紧凑的方式来执行模式匹配,还是有另一种(也更紧凑)的方式来进行我的财产检查?我不想将属性添加到数据类型定义中,因为它可以相对容易地计算.

haskell pattern-matching

5
推荐指数
2
解决办法
531
查看次数

你如何使用Data.Function.Memoize的类方法?

我正在研究NP搜索问题,并被告知我可以通过使用所述包加快搜索过程.由于回忆对我来说是一个新概念,我发现除了"标准"记忆的斐波那契序列之外,我很难将其包围起来.

为了将数据类型'a'实例化为Memoizable,我需要在其上定义一个函数memoize(::(a-> v) - > a - > v).

我有一个数据类型数据公式在类(Eq,Ord,Show)中.我将不得不定义自己的实例声明,但不知道预期的功能.

这个函数究竟应该为memoisation定义什么?包描述没有详细说明,我怀疑功能应用程序(适合类型签名)将加速任何事情.

haskell class memoization package

3
推荐指数
1
解决办法
202
查看次数

如何在Data.Function.Memoize中使用memoize函数

在未能构建我自己的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此包中的功能提高性能?

haskell memoization fibonacci

2
推荐指数
1
解决办法
836
查看次数

应对任意深度嵌套列表

我正在编写一段代码,通过吃掉包含输入元素的列表来产生大量结果.说[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产生所述输出

这不起作用,我相信我不会发现这样的工作功能.描述这种递归的正确方法是什么?

recursion haskell list

1
推荐指数
1
解决办法
304
查看次数