使用类型级自然的典型定义,我已经定义了一个n维网格.
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
data Nat = Z | S Nat
data U (n :: Nat) x where
Point :: x -> U Z x
Dimension :: [U n x] -> U n x -> [U n x] -> U (S n) x
dmap :: (U n x -> U m r) -> U (S n) x -> U (S m) r
dmap f (Dimension ls mid …Run Code Online (Sandbox Code Playgroud) 我正在为n * nHaskell 中的板子实现一个tic tac toe游戏,我需要生成我可以从下一步移动获得的所有板配置.
我的董事会定义如下:
data Cell = E
| X
| O
deriving (Eq,Show)
type Row a = [a]
type Board = Row (Row Cell)
iniBoard :: Int -> Board
iniBoard n = let row = replicate n E in replicate n row
Run Code Online (Sandbox Code Playgroud)
我可以确定,给定的板配置是否为玩家赢了x,所以我有
win :: Cell -> Board -> Bool
win E _ = False
win x brd = any full $ diags brd ++ rows brd ++ cols brd
where
diags …Run Code Online (Sandbox Code Playgroud) 我想编写一个函数来计算7元组中数字1到7的所有组合,但是每个数字在每个元组中只能出现一次。
到目前为止,我已经找到了这种方法,但是它还会返回每个元组中多次出现相同编号的组合。我不太确定如何删除具有相同编号的多次出现的元组。
a = [(a,b,c,d,e,f,g) | a <- [1..7], b <- [1..7], c <- [1..7],
d <- [1..7], e <- [1..7], f <- [1..7], g <- [1..7]]
Run Code Online (Sandbox Code Playgroud)
目标结果示例(所有有效组合都应在此处):
[(1,2,3,4,5,6,7),(2,1,3,4,5,6,7),(2,3,1,4,5,6,7),...]
Run Code Online (Sandbox Code Playgroud) 这是一种解决欧拉问题43的方法(如果没有给出正确答案,请告诉我).是否有monad或其他合成糖可以帮助跟踪notElem条件?
toNum xs = foldl (\s d -> s*10+d) 0 xs
numTest xs m = (toNum xs) `mod` m == 0
pandigitals = [ [d0,d1,d2,d3,d4,d5,d6,d7,d8,d9] |
d7 <- [0..9],
d8 <- [0..9], d8 `notElem` [d7],
d9 <- [0..9], d9 `notElem` [d8,d7],
numTest [d7,d8,d9] 17,
d5 <- [0,5], d5 `notElem` [d9,d8,d7],
d3 <- [0,2,4,6,8], d3 `notElem` [d5,d9,d8,d7],
d6 <- [0..9], d6 `notElem` [d3,d5,d9,d8,d7],
numTest [d6,d7,d8] 13,
numTest [d5,d6,d7] 11,
d4 <- [0..9], d4 `notElem` [d6,d3,d5,d9,d8,d7],
numTest [d4,d5,d6] 7,
d2 …Run Code Online (Sandbox Code Playgroud) 我有这个代码,但它没有完全做我想要的,我拿了一个元组列表;
[(3,2),(1,2),(1,3),(1,2),(4,3),(3,2),(1,2)]
Run Code Online (Sandbox Code Playgroud)
并给出
[(1,3),(4,3),(3,2),(1,2)]
Run Code Online (Sandbox Code Playgroud)
但我希望它给予
[(1,3),(4,3)]
Run Code Online (Sandbox Code Playgroud)
我哪里做错了?提前致谢.
eliminate :: [(Int,Int)] -> [(Int,Int)]
eliminate [] = []
eliminate (x:xs)
| isTheSame xs x = eliminate xs
| otherwise = x : eliminate xs
isTheSame :: [(Int,Int)] -> (Int,Int) -> Bool
isTheSame [] _ = False
isTheSame (x:xs) a
| (fst x) == (fst a) && (snd x) == (snd a) = True
| otherwise = isTheSame xs a
Run Code Online (Sandbox Code Playgroud) 在Haskell中,takeWhile允许从一个(可能是无限的)列表中获取条目,直到某个条件不成立.
但是,此条件不能取决于列表的先前条目.
take在我遇到本例中概述的第一个副本之前,如何从(可能是无限的)列表中输入条目?
*Main> takeUntilDuplicate [1,2,3,4,5,1,2,3,4]
[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud) 我想返回列表中元素的前一个元素.我打算获取参数索引并使用它来弃用列表,使得参数是最后一个元素,然后反转它并获取反向列表的第二个元素.我得到的错误:类型elemIndex是Maybe Int同时take功能要求Int.我想修复它或使用简单的递归编写代码是否有使用递归的较短代码?
precedingElement :: Eq a => a -> [a] -> Maybe a
precedingElement elt lst | lst == [] = error "List is empty"
| elt `notElem` lst = Nothing
| otherwise = Just x where x = snd (reverse (take (elt `elemIndex` lst) lst))
Run Code Online (Sandbox Code Playgroud) 我想知道如何通过使用Haskell列表理解从列表中获取唯一值.因此,如果我输入[2,4,5,4,4,6,2],它将返回[2,4,5,6].
最初我开始使用unique(y:ys)= [x | x < - (y:ys)]我知道我需要x上的其他条件,但我不知道如何到达那里.