相关疑难解决方法(0)

从两个HList创建所有对的HList

我在Scala中使用无形,我想编写一个函数allPairs,它将获取两个HLists并返回所有元素对的HList.例如:

import shapeless._
val list1 = 1 :: "one" :: HNil
val list2 = 2 :: "two" :: HNil
// Has value (1, 2) :: (1, "two") :: ("one", 2) :: ("one", "two") :: HNil
val list3 = allPairs(list1, list2)
Run Code Online (Sandbox Code Playgroud)

知道怎么做吗?

另外,我想强调一下我正在寻找一个函数,而不是一个内联的代码块.

scala hlist shapeless

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

在Haskell中整理列表理解

所以我试图在Haskell中生成一个出租车编号列表.出租车编号是可以用两种不同方式写成两个不同立方体之和的数字 - 最小的是 1729 = 1^3 + 12^3 = 9^3 + 10^3.

现在,我只是生成了四个"组成"出租车编号的数字,例如(1,12,9,10),并被告知使用列表理解(我不太熟悉) ).此函数将生成所有4元组,其中最大数字最多为n:

taxi n = [(a,b,c,d) | a <- [1..n], b <- [1..n], c <- [1..n], d <- [1..n], a^3 + b^3 == c^3 + d^3, a < b, a < c, c < d]

但是,由于以下几个原因,它很麻烦:

  • a,b,c,d的域都是相同的,但我无法弄清楚如何简化这段代码,因此[1..n]只写一次.
  • 我想要一个没有上限的无限列表,所以我可以让程序尽可能长时间运行并在我请求时终止它.很明显,如果我只是设置a <- [1..]等等,那么程序永远不会最终评估任何东西.
  • 程序非常慢:只需taxi 5019秒.

任何速度优化也都会很好,但如果不是我使用的天真方法就足够了.

haskell list-comprehension infinite

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

不同类型的任意多个列表的笛卡尔积

已经提出并回答了几个类似的问题。可以找到实例,例如:

  1. Haskell中2个列表的笛卡尔积
  2. 笛卡尔积在Haskell的列表中
  3. 如何迭代计算笛卡尔积?

但是,我所发现的东西都没有完全回答我的问题。

在Haskell中,是否可能以及如何定义一个函数cartesianProduct,该函数任意(有限)地获取许多不同类型的列表并在鼻子上输出其笛卡尔积?

背景

例如,在上面的链接中,可以找到一个cartesianProd_2优雅地吸收两个不同类型列表的列表:

cartesianProd_2 :: [a] -> [b] -> [(a,b)]
cartesianProd_2 list_A list_B = [(x,y) | x<-list_A, y<-list_B]
Run Code Online (Sandbox Code Playgroud)

cartesianProd_n对于某些固定整数n,可以很容易地将其推广为。

但是,我希望我可以定义一个

cartesianProd (list_1,list_2) == (cartesianProd_2 list_1 list_2)
cartesianProd (list_1,list_2,list_3) == (cartesianProd_3 list_1 list_2 list_3)

-- and so on .. notice that list_i is a list of elements of type i.
Run Code Online (Sandbox Code Playgroud)

一个直接的障碍,我遇到的是,我甚至不知道是什么类型cartesianProd啊!它的域是(不同类型的列表)的元组!那我该怎么办?

编辑

如果在Haskell中无法做到,请提供(指向)指针。

haskell types cartesian-product infinite

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

无限列表的笛卡儿积分haskell

我有一个有限列表的函数

> kart :: [a] -> [b] -> [(a,b)]
> kart xs ys = [(x,y) | x <- xs, y <- ys]
Run Code Online (Sandbox Code Playgroud)

但如何为无限列表实现它?我听说过Cantor和集合理论......

我也发现了一个类似的功能

> genFromPair (e1, e2) = [x*e1 + y*e2 | x <- [0..], y <- [0..]]
Run Code Online (Sandbox Code Playgroud)

但是我不确定它是否有帮助,因为拥抱只会在没有中断的情况下发出对.

感谢帮助.

haskell

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

迭代所有(行,列)的可能性?

这将是一个TicTacToe实现:

data Row    = A | B | C  deriving (Show, Read, Eq, Ord, Enum, Bounded)
data Column = X | Y | Z  deriving (Show, Read, Eq, Ord, Enum, Bounded)
type Pos = (Row, Column)
data Player = Player String
data Field = Field [(Pos, Player)]
initialField :: Field
initialField = Field []
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,initialField只是一个空列表,当玩家进行移动时,(pos,player)tupels将被添加到列表中.到现在为止还挺好.但是现在我在编写一个possibleMoves :: Field -> [Pos]函数来获取空字段时遇到了麻烦.如何迭代Haskell中的所有Row,Column可能性?我觉得我的方法是错的,但我是Haskell的新手,所以我没有更好的主意.

haskell loops list

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

在Scala中组合嵌套列表 - 展平Carthesian产品

我有一个有趣的问题,对Scala新手来说很难证明.
我需要结合2个列表:

listA : List[List[Int]]
listB : List[Int]
Run Code Online (Sandbox Code Playgroud)

通过以下方式:

val listA = List(List(1,1), List(2,2))
val listB = List(3,4)
val listC = ???

// listC: List[List[Int]] = List(List(1,1,3),List(1,1,4),List(2,2,3),List(2,2,4)
Run Code Online (Sandbox Code Playgroud)

在Java中,我会使用几个嵌套循环:

for(List<Integer> list : listA) {
    for(Integer i: listB) {
        subList = new ArrayList<Integer>(list);
        subList.add(i);
        listC.add(subList);
    }
}
Run Code Online (Sandbox Code Playgroud)

我猜这是Scala中的一个班轮,但到目前为止它还在逃避我.

scala

3
推荐指数
2
解决办法
626
查看次数

在Haskell中压缩

我正在开发一个函数,该函数将使用两个六个六边形的骰子,并在元组列表中返回配对的所有可能性。

因此,我希望我的程序返回如下内容:

[(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),
 (2,1),(2,2),(2,3),(2,4),(2,5),(2,6),
 (3,1),(3,2),(3,3),(3,4),(3,5),(3,6),
 (4,1),(4,2),(4,3),(4,4),(4,5),(4,6),
 (5,1),(5,2),(5,3),(5,4),(5,5),(5,6),
 (6,1),(6,2),(6,3),(6,4),(6,5),(6,6)]
Run Code Online (Sandbox Code Playgroud)

我认为我的头可能在正确的常规区域,但是执行起来有点麻烦,因为我是Haskell的新手。这是我所拥有的:

rolls :: [(Integer, Integer)]
fstDice = [1, 2, 3, 4, 5, 6]
sndDice = [1, 2, 3, 4, 5, 6]
rolls
    | zip fstDice sndDice
    | drop 1 sndDice
    | otherwise = rolls 
Run Code Online (Sandbox Code Playgroud)

我知道最后一部分是非常错误的,相信我。我以前是zip将两个骰子放在一起,然后想到要放下head第二个骰子,然后重复该过程,直到sndDice没有空并找到所有的骰子对为止。

我不确定这个想法是否错误,或者只是我的业余执行不正确。

(根据记录,我知道它不会编译!我也不知道如何处理该错误。)

haskell tuples list cartesian-product

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

在Haskell中,列表理解的内部工作原理是什么?

我对Haskell很新,并且在这里看这篇文章:Haskell中2个列表的笛卡尔积.

在答案中有这段代码:

cartProd xs ys = [(x,y) | x <- xs, y <- ys]
Run Code Online (Sandbox Code Playgroud)

哪两个列表:

xs = [1,2,3]
ys = [4,5,6]
Run Code Online (Sandbox Code Playgroud)

会屈服

[(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)]
Run Code Online (Sandbox Code Playgroud)

如果我没有看到这个结果,我会认为它会回来

[(1,4),(2,5),(3,6)]
Run Code Online (Sandbox Code Playgroud)

因为它会同时遍历两个列表.

但现在它 - 我更熟悉的编程语言 - 看起来像用于遍历矩阵的双循环:

for (int x = 1; x < 4; x++)
    for(int y = 4; y < 7; y++)
        //make tuple (x,y)
Run Code Online (Sandbox Code Playgroud)

导致列表理解以这种方式表现的原因是什么?

haskell list

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

Haskell - 如何获取具有某些组合的元组列表

有没有办法创建具有特定模式的元组列表?

例如,我有以下输入:

a = 100

b = [10,20,30]

c = ['a','b','c','d','e','f','g']
Run Code Online (Sandbox Code Playgroud)

我想要以下输出:

[(100,10,'a'),(100,10,'b'),(100,10,'c'),(100,10,'d'),(100,10,'e'),(100,10,'f'),(100,10,'g'),
 (100,20,'a'),(100,20,'b'),(100,20,'c'),(100,20,'d'),(100,20,'e'),(100,20,'f'),(100,20,'g'),
 (100,30,'a'),(100,30,'b'),(100,30,'c'),(100,30,'d'),(100,30,'e'),(100,30,'f'),(100,30,'g')]
Run Code Online (Sandbox Code Playgroud)

我想如果我只有ab例如我会这样做:

makeTuple :: Int -> [Int] -> [(Int,Int)]
makeTuple _ [] = []
makeTuple i (x:xs) = [(i,x)] ++ makeTuple i xs
Run Code Online (Sandbox Code Playgroud)

这会给我:

[(100,10),(100,20),(100,30)]
Run Code Online (Sandbox Code Playgroud)

我不确定如何让它与 3 个输入一起工作。

haskell functional-programming

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

在Haskell中生成网格坐标的元组

我想编写一个函数来生成包含n×n网格坐标的元组列表.

例如:

> genGrid 2
[(0,0),(0,1),(1,0),(1,1)]
> genGrid 3
[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)]
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过执行以下操作生成对角线:

genDiagonal n = zip [0..] [0..n-1]
Run Code Online (Sandbox Code Playgroud)

我想有一种相当简单的方法可以做到这一点,也许是我对角函数的变体,但是我的空白.

haskell grid-layout

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