我在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)
知道怎么做吗?
另外,我想强调一下我正在寻找一个函数,而不是一个内联的代码块.
所以我试图在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]
但是,由于以下几个原因,它很麻烦:
[1..n]只写一次.a <- [1..]等等,那么程序永远不会最终评估任何东西.taxi 5019秒.任何速度优化也都会很好,但如果不是我使用的天真方法就足够了.
已经提出并回答了几个类似的问题。可以找到实例,例如:
但是,我所发现的东西都没有完全回答我的问题。
在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中无法做到,请提供(指向)指针。
我有一个有限列表的函数
> 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)
但是我不确定它是否有帮助,因为拥抱只会在没有中断的情况下发出对.
感谢帮助.
这将是一个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的新手,所以我没有更好的主意.
我有一个有趣的问题,对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中的一个班轮,但到目前为止它还在逃避我.
我正在开发一个函数,该函数将使用两个六个六边形的骰子,并在元组列表中返回配对的所有可能性。
因此,我希望我的程序返回如下内容:
[(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很新,并且在这里看这篇文章: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)
导致列表理解以这种方式表现的原因是什么?
有没有办法创建具有特定模式的元组列表?
例如,我有以下输入:
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)
我想如果我只有a和b例如我会这样做:
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 个输入一起工作。
我想编写一个函数来生成包含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)
我想有一种相当简单的方法可以做到这一点,也许是我对角函数的变体,但是我的空白.