gpt4 book ai didi

C++ 到函数式

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:04:30 25 4
gpt4 key购买 nike

我想知道如何在函数式编程语言中做到这一点。也许是 F# 或 Haskell。

除了 findrfind 之外,谁能给我一个不使用任何函数调用的例子?

此函数使用 i 作为 slash 的编号(<0 表示向后)查找下一个斜杠。

size_t findSlash(const char *sz, size_t i)
{
std::string s = sz;
size_t a, b, c, n, ai = abs(i), pos=0;
for (n=0; n<ai; n++)
{
if (i<0)
{
a = s.rfind("\\", pos);
b = s.rfind("/", pos);
}
else
{
a = s.find("\\", pos);
b = s.find("/", pos);
}
if (a==-1u)
{
if (b==-1u)
return pos;
c = b;
}
else if (b==-1u)
c = a;
else
c = min(a, b);
pos = c+1;
}
return c;
}

最佳答案

haskell :

import Data.List

findSlash :: String -> Int -> Int
findSlash str i = findIndices (\c -> c == '\\' || c == '/') str !! i

处理负索引(这很丑陋,因为你真的不想这样做):

findSlash :: String -> Int -> Int
findSlash str i =
index (findIndices (\c -> c == '\\' || c == '/') str) i
where index xs i | i < 0 = (reverse xs) !! ((-i) - 1)
| i >= 0 = xs !! i

处理错误:

findSlash :: String -> Int -> Maybe Int
findSlash str i = index i
where xs = findIndices (\c -> c == '\\' || c == '/') str
l = length xs
index i
| i < 0 && i < (-l) = Nothing
| i >= 0 && i >= l = Nothing
| i < 0 = Just $ (reverse xs) !! ((-i) - 1)
| i >= 0 = Just $ xs !! i

现在你可以说:

map (findSlash "/foo/bar/baz") [-4..4]

并得到:

-- -4        -3     -2     -1      0      1      2       3       4
[Nothing,Just 0,Just 4,Just 8,Just 0,Just 4,Just 8,Nothing,Nothing]

无论如何,处理从末尾开始的偏移量会使代码变得非常丑陋,并且破坏了惰性评估的可能性。所以我认为大多数人会使用第一个,也许会加入一些错误检查。(这也可以消除懒惰,因为长度会强制对整个列表进行评估。您可以使用“drop”而不是“!!”但是,为了避免错误并防止评估整个结果列表。TMTOWTDI。)

关于C++ 到函数式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/548584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com