相关疑难解决方法(0)

为n维网格类型编写cojoin或cobind

使用类型级自然的典型定义,我已经定义了一个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)

haskell comonad

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

Haskell - 如何使用列表monad在tic tac toe游戏中生成下一步

我正在为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)

algorithm monads haskell

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

寻找组合

我想编写一个函数来计算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)

haskell list-comprehension

7
推荐指数
4
解决办法
194
查看次数

Euler 43 - 是否有一个monad来帮助写这个列表理解?

这是一种解决欧拉问题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)

monads haskell list-comprehension

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

在Haskell中完全消除重复项

我有这个代码,但它没有完全做我想要的,我拿了一个元组列表;

[(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 list

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

从列表中取出直到遇到重复

在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)

haskell

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

在列表中找到元素的前一个元素(Haskell)

我想返回列表中元素的前一个元素.我打算获取参数索引并使用它来弃用列表,使得参数是最后一个元素,然后反转它并获取反向列表的第二个元素.我得到的错误:类型elemIndexMaybe 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 list

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

列表理解唯一值

我想知道如何通过使用Haskell列表理解从列表中获取唯一值.因此,如果我输入[2,4,5,4,4,6,2],它将返回[2,4,5,6].

最初我开始使用unique(y:ys)= [x | x < - (y:ys)]我知道我需要x上的其他条件,但我不知道如何到达那里.

recursion haskell list-comprehension list

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