小编Tik*_*vis的帖子

如何将这个二进制递归函数转换为尾递归形式?

对于在函数下关闭的集合,有一种明确的方法可以将二进制递归转换为尾递归,即为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)

binary-tree haskell functional-programming tail-recursion

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

从 Haskell 中的字符串列表中删除字符串

我有一个关于 Haskell 的问题一直困扰着我。我目前需要编写一个函数来删除字符串,即"word"从字符串列表中["hi", "today", "word", "Word", "WORD"]返回 list ["hi", "today", "Word", "WORD"]。我无法使用任何高阶函数,只能诉诸原始递归。

考虑到这个问题,我想也许我可以通过使用递归来解决它,在该递归中搜索第一个字符串的头部,如果匹配,"w"则比较尾部的下一个头部,看看是否匹配"o"。但后来我很快意识到,完成所有这些工作后,您将无法删除完整的字符串"word"

我的问题实际上是如何比较列表中的整个字符串,而不是一次只比较 1 个元素,例如:removeWord (x:xs)。有可能吗?我是否必须编写一个辅助函数来帮助解决问题?

string haskell

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

为什么mod在表达式中给出的结果与在函数调用中的结果不同?

假设想要计算函数:

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

haskell modulo

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

Haskell处理[IO String]

我有以下功能:

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)

谢谢!

io monads haskell functional-programming

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

用列表中的字符串替换字符串

我正在尝试编写一个函数,该函数包含一个搜索词列表,一个替换词列表和一个将使用这些词的字符串.

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)

string haskell replace list

4
推荐指数
1
解决办法
192
查看次数

为什么类型的Text.Parsec.Token.natural在Hoogle和显示的内容之间是不一样的:t?

我搜索了Text.Parsec.Token.natural关于Hoogle和发现的类型Text.Parsec.Token.naturalnatural :: 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)

而且不仅是自然的,所以是整数,浮点数,小数等.

haskell types parsec ghc

4
推荐指数
1
解决办法
188
查看次数

如何将OCaml字节码映射到其原始源代码位置?

从字节码的某些部分到最初来自的代码行,是否有一些很好的格式或库特性?这显然对调试和错误消息很有用.

特别是,我正在考虑将源映射的支持添加到js_of_ocaml是多么困难.

ocaml source-maps js-of-ocaml

4
推荐指数
1
解决办法
307
查看次数

如何将可选属性附加到值?

我想存储一些"东西"列表,它们可以附加一些可选的额外属性.每件事物都可以有一个或多个属性.不同的属性有不同的类型.

我希望能够在代码中简明扼要地创建这些事物的文字列表.但是我很难看到如何通过类型系统,因为元组允许类型的混合但是固定长度,而列表是可变长度但是一种类型.

这是我想要做的一个玩具示例:

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)

等等

这样做的正确方法是什么?

haskell types variant

4
推荐指数
1
解决办法
191
查看次数

Haskell Guards和SublimeText 3

我切换到Sublime Text 3,但现在我在ST3中编写了一些Haskell,我注意到一些非常奇怪的东西,这是守卫的语法高亮逻辑.

正如你所看到的,当我这样写的时候,它突出了白色的第一个守卫和白色/洋红色混合的不同标志:

正确的警卫,不正确的突出显示.

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

防护装置不正确,正确突出显示.

有谁知道如何解决这一问题?

syntax haskell syntax-highlighting sublimetext sublimetext3

4
推荐指数
1
解决办法
1074
查看次数

如何在元组列表中查找重复项?

筛选元组列表并返回值fstsnd值相同的最佳方法是什么?

[(2,1),(2,2),(3,1),(10,9),(10,10)] 
Run Code Online (Sandbox Code Playgroud)

将返回(2,2)(10,10).

haskell tuples

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