Haskell中是否有任何库函数可以让我检查列表是否连续排序?例如.[1,2,3,4]有效,[1,2,3,10]无效.
基本上我可以有一个范围在3到5个元素之间的列表,我正在尝试检查该列表是否连续排序.
我的尝试(我不确定这是否是接近它的正确方法,似乎过多的重复)
isSucc:: [Integer] -> Bool
isSucc[] = True
isSucc(x:y:zs) =
if (x+1) == y
then True && isSucc(y:zs)
else isSucc(y:zs)
Run Code Online (Sandbox Code Playgroud)
在我使用此功能之后,我计划使用它来过滤列表列表(仅将列表保留在列表中,并且仅在连续排序时)
有人可以向我解释如何创建自定义数据类型?
**我不允许对Suit本身进行修改,例如.派生(Eq,Ord)
data Suit = Clubs | Diamonds | Hearts | Spades deriving (Eq)
Run Code Online (Sandbox Code Playgroud)
我的尝试:
instance Ord Suit where
compare suit1 suit2 = compare suit1 suit2
Run Code Online (Sandbox Code Playgroud)
但这似乎是一个连续的循环,并没有停止.
我有一个自定义列表类型:
data NNList a = Sing a | Append ( NNList a) ( NNList a) deriving (Eq)
data CList a = Nil | NotNil ( NNList a) deriving (Eq)
Run Code Online (Sandbox Code Playgroud)
我正在尝试实现一个返回列表头部和尾部的函数:
cListGet :: CList a - > Maybe(a,CList a)
我的尝试:
cListGet :: CList a -> Maybe (a, CList a)
cListGet Nil = Nothing
cListGet xs@(NotNil nxs) =
case nxs of
Sing x -> (x, Nil)
Append l r -> ((fst $ cListGet (NotNil l)), (Append (snd $ cListGet (NotNil l)), r)) …Run Code Online (Sandbox Code Playgroud) 我正在写一些代码,结果却让我觉得太难看了.反正我是否可以重构它以便我不使用嵌套的if语句?
def hours_occupied(date)
#assuming date is a valid date object
availability = get_work_hours(date)
focus = "work"
if availability.nil
availability = get_family_hours(date)
focus = "family"
if availability.nil
availability = get_friend_hours(date)
focus = "friends"
end
end
end
Run Code Online (Sandbox Code Playgroud)
我知道我可以做这样的事情以获得可用性
availability = get_work_hours(date) || get_family_hours(date) || get_friend_hours(date)
Run Code Online (Sandbox Code Playgroud)
但是如何相应地设置焦点变量?
在SML中,您是否可以在一个case语句中使用多个模式?
例如,我有4个算术运算符中的字符串表示,"+", "-", "*", "/"我想打印"PLUS MINUS"的是"+" or "-"和"MULT DIV",如果它是"*" or "/".
TL; DR:在某些地方,我可以简化以下内容以减少使用案例吗?
case str of
"+" => print("PLUS MINUS")
| "-" => print("PLUS MINUS")
| "*" => print("MULT DIV")
| "/" => print("MULT DIV")
Run Code Online (Sandbox Code Playgroud) 我是Haskell的新手,我正在尝试生成列表中所有连续的子列表.
我目前有以下内容:
listSublists :: [a] -> [[a]]
listSublists [] = [[]]
listSublists xs = [xs] ++ listSublists (init xs)
Run Code Online (Sandbox Code Playgroud)
我知道上面的函数会生成删除最后一个元素的子列表,但我不知道如何完成我的伪代码.
我的伪代码基本上是,
拿整个完整列表,删除尾部.将(x:xs)的xs传递给listSublists
例如,xs = [1,2,3] [xs] ++ listSublists(init xs)将生成[1,2,3,4],[1,2,3],[1,2],[1] ],[]我试图继续将[2,3,4]作为xs传递,直到列表用完为止.
有人可以给我一些指示吗?还是我以完全错误的方式思考?
在Haskell的编程中,Graham Hutton定义了列表展开如下:
unfold :: (b -> Bool ) -> (b -> a) -> (b -> b) -> b -> [a]
unfold p h t x | p x = []
| otherwise = h x : unfold p h t (t x)
Run Code Online (Sandbox Code Playgroud)
定义一个函数
• listUnfold :: (b -> Bool) -> (b -> a) -> (b -> b) -> b -> [a]
Run Code Online (Sandbox Code Playgroud)
这与上面的类似,但在其实现中使用unfoldr并且是非递归的.
我已经尝试了一段时间来解决上面的问题,但我仍然可以设法这样做(在Haskell和一般的函数式编程中相当新).
我的尝试:
listUnfold :: (b -> Bool) -> (b -> a) -> (b -> b) -> b -> …Run Code Online (Sandbox Code Playgroud) 无论如何,我可以在Haskell中扩展列表列表吗?
我正在尝试编写一个生成[1,2,2,3,3,3,4,4,4,4 .....]的函数,它基本上是1个,2个,2个,3个等等.
我的尝试:
Run Code Online (Sandbox Code Playgroud)nnss :: [Integer] nnss = [nPrint x x | x <- [1,2..]]
我尝试的问题是nPrint x x返回一个整数列表,例如,nPrint 2 2将返回[2,2].无论如何,我可以将列表从[1,2,3 ...]"扩展"到[1,2,2,3,3,3 ...]?
我有一个示例字符串"Canon PowerShot 12.1-Megapixel",当我运行以下代码时,它似乎失败了:
db.execute "CREATE TABLE IF NOT EXISTS Products( id INTEGER PRIMARY KEY, stockID INTEGER, Name TEXT )"
id = 12345
name = "Canon PowerShot 12.1-Megapixel"
db.execute( "INSERT INTO Products ( stockID, Name ) VALUES ( #{id}, #{name} )" )
Run Code Online (Sandbox Code Playgroud)
错误代码是:
C:/Ruby/Ruby193/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.6-x86-mingw32/lib/sqlite3/d
atabase.rb:91:in `initialize': near "PowerShot": syntax error
(SQLite3::SQLExcep tion)
from C:/Ruby/Ruby193/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.6-x86-mingw32/
lib/sqlite3/database.rb:91:in `new'
from C:/Ruby/Ruby193/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.6-x86-mingw32/
lib/sqlite3/database.rb:91:in `prepare'
from C:/Ruby/Ruby193/lib/ruby/gems/1.9.1/gems/sqlite3-1.3.6-x86-mingw32/
lib/sqlite3/database.rb:134:in `execute'
from E:/Documents/Cowboom/scraping/DBDOTDList.rb:48:in `<main>'
Run Code Online (Sandbox Code Playgroud)
知道为什么在"PowerShot"之后死了吗?
data Tree a = Leaf | Node (Tree a) a (Tree a) deriving (Eq, Show)
unfoldTree:: (b -> Maybe (b, a, b)) -> b -> Tree a
unfoldTree f b =
case f b of
Nothing -> Leaf
Just (lt, x, rt) -> Node (unfoldTree f lt) x (unfoldTree f rt)
Run Code Online (Sandbox Code Playgroud)
鉴于上面的两条信息,我被要求实现树构建功能.
我的尝试是
treeBuild :: Integer -> Tree Integer
treeBuild 0 = Leaf
treeBuild n = treeUnfold (\b -> if b < 2^n-1
then Just(2*b, b + 1, 2*b + …Run Code Online (Sandbox Code Playgroud)