对于在函数下关闭的集合,有一种明确的方法可以将二进制递归转换为尾递归,即为Fibonacci序列添加整数:
(使用Haskell)
fib :: Int -> Int
fib n = fib' 0 1 n
fib' :: Int -> Int -> Int
fib' x y n
| n < 1 = y
| otherwise = fib' y (x + y) (n - 1)
Run Code Online (Sandbox Code Playgroud)
这工作,因为我们有我们的期望值y,而我们的操作,x + y其中x + y返回一个整数,就像y做.
但是,如果我想使用未在函数下关闭的集合,该怎么办?我想采用一个将列表拆分为两个列表的函数,然后对这两个列表执行相同的操作(例如递归创建二叉树),当另一个函数神奇地说明何时停止查看结果分割时,我停止:
[1, 2, 3, 4, 5] -> [[1, 3, 4], [2, 5]] -> [[1, 3], [4], [2], [5]]
Run Code Online (Sandbox Code Playgroud)
那是,
splitList :: [Int] -> [[Int]]
splitList …Run Code Online (Sandbox Code Playgroud) 我有一个关于 Haskell 的问题一直困扰着我。我目前需要编写一个函数来删除字符串,即"word"从字符串列表中["hi", "today", "word", "Word", "WORD"]返回 list ["hi", "today", "Word", "WORD"]。我无法使用任何高阶函数,只能诉诸原始递归。
考虑到这个问题,我想也许我可以通过使用递归来解决它,在该递归中搜索第一个字符串的头部,如果匹配,"w"则比较尾部的下一个头部,看看是否匹配"o"。但后来我很快意识到,完成所有这些工作后,您将无法删除完整的字符串"word"。
我的问题实际上是如何比较列表中的整个字符串,而不是一次只比较 1 个元素,例如:removeWord (x:xs)。有可能吗?我是否必须编写一个辅助函数来帮助解决问题?
假设想要计算函数:
f (x,y) = ((x `mod` 3)+(y `mod` 3)) `mod` 2
Run Code Online (Sandbox Code Playgroud)
然后,如果f (-1,0)手动扩展,则获得:
((-1 `mod` 3)+(0 `mod` 3)) `mod` 2
1
Run Code Online (Sandbox Code Playgroud)
但是,如果使用内联函数,结果是:
let f (x,y) = ((x `mod` 3)+(y `mod` 3)) `mod` 2 in f (-1,0)
0
Run Code Online (Sandbox Code Playgroud)
存储产生不是预期结果的函数时会发生什么?
我认为这是因为f使用Integral而不是Int?
我有以下功能:
lines' :: [IO String]
lines' = getLine : lines'
Run Code Online (Sandbox Code Playgroud)
我希望我可以在这个列表中使用所有强大的列表函数,比如过滤器等.但是我对haskell中IO monad的了解是可以改进的.
在使用Rx for C#之后,io_stuff-list列表使我信服.
有没有办法在哈斯克尔做我想做的事情?就像是:
ten_lines :: [IO String]
ten_lines = take 10 lines'
proc_lines :: [IO String]
proc_lines = [ (l, length l) | l <- lines' ]
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在尝试编写一个函数,该函数包含一个搜索词列表,一个替换词列表和一个将使用这些词的字符串.
listReplace :: [String] -> [String] -> String -> String
Run Code Online (Sandbox Code Playgroud)
棘手的部分是如果拟合搜索词是第n个,那么应该使用第n个替换词.此外,当使用替换词时,如果它本身实际上是一个搜索词,则不应该用不同的替换词替换它.我已经写过这些函数了
replace :: String -> String -> String -> String:
replace x y [] = []
replace x y (z:zs) = if isPrefixOf x (z:zs) then y ++ replace x y (drop (length x) (z:zs)) else z: (replace x y zs)
Run Code Online (Sandbox Code Playgroud)
和
replace' :: String -> [String] -> String -> String:
replace' x y [] = []
replace' x [] (z:zs) = []
replace' x y (z:zs) = if isPrefixOf …Run Code Online (Sandbox Code Playgroud) 我搜索了Text.Parsec.Token.natural关于Hoogle和发现的类型Text.Parsec.Token.natural是natural :: ParsecT s u m Integer.
但这与我:t在GHCi中所得到的相矛盾.
GHCi给出了这种类型:
Prelude Text.Parsec.Token> :t natural
natural
:: GenTokenParser s u m -> Text.Parsec.Prim.ParsecT s u m Integer
Run Code Online (Sandbox Code Playgroud)
而且不仅是自然的,所以是整数,浮点数,小数等.
从字节码的某些部分到最初来自的代码行,是否有一些很好的格式或库特性?这显然对调试和错误消息很有用.
特别是,我正在考虑将源映射的支持添加到js_of_ocaml是多么困难.
我想存储一些"东西"列表,它们可以附加一些可选的额外属性.每件事物都可以有一个或多个属性.不同的属性有不同的类型.
我希望能够在代码中简明扼要地创建这些事物的文字列表.但是我很难看到如何通过类型系统,因为元组允许类型的混合但是固定长度,而列表是可变长度但是一种类型.
这是我想要做的一个玩具示例:
things = [
Thing 1 RED,
Thing 2 RED LARGE,
Thing 3 BLUE SMALL,
Thing 4 SMALL,
Thing 5 BLUE DOTTED
]
Run Code Online (Sandbox Code Playgroud)
等等
这样做的正确方法是什么?
我切换到Sublime Text 3,但现在我在ST3中编写了一些Haskell,我注意到一些非常奇怪的东西,这是守卫的语法高亮逻辑.
正如你所看到的,当我这样写的时候,它突出了白色的第一个守卫和白色/洋红色混合的不同标志:

只有当我使用这种错误的语法(在参数后面带有等号)时才能正确显示.

有谁知道如何解决这一问题?
筛选元组列表并返回值fst和snd值相同的最佳方法是什么?
[(2,1),(2,2),(3,1),(10,9),(10,10)]
Run Code Online (Sandbox Code Playgroud)
将返回(2,2)和(10,10).
haskell ×9
string ×2
types ×2
binary-tree ×1
ghc ×1
io ×1
js-of-ocaml ×1
list ×1
modulo ×1
monads ×1
ocaml ×1
parsec ×1
replace ×1
source-maps ×1
sublimetext ×1
sublimetext3 ×1
syntax ×1
tuples ×1
variant ×1