如何使用搭扣功能修复此haskell函数?

时间:2019-03-09 02:17:57

标签: haskell

要求我创建一个haskell函数,该函数将执行以下操作:

 $query = "INSERT INTO `User` (`email`, `password`) VALUES ('".mysqli_real_escape_string($link, $_POST['email'])."', '".mysqli_real_escape_string($link, $_POST['password'])."')";

            if (mysqli_query($link, $query)) {


                $query = "UPDATE `User` SET password = '".md5(md5(mysqli_insert_id($link)).$_POST['password'])."' WHERE id = ".mysqli_insert_id($link)." LIMIT 1";

                mysqli_query($link, $query);


            } else {

                echo "<p>There was a problem signing you up - please try again later.</p>";

            }

从本质上讲,它会将相同的连续术语分组

我应该在以下时间使用取放物品:

group [1,1,2,3,3] = [[1,1],[2],[3,3]]

group [] = []

这就是我所拥有的。

以上方法适用于单个元素位于结尾group [] = [] group (x:xs) = (takeWhile cond xs ++ [x]) : group (dropWhile cond xs) where cond = (\x -> x == head xs) 的情况,但不适用于中间元素:group [1,1,2] == [[1,1],2](应为group [1,1,1,2,4] == [[1,1,1],[4,2]]

我在功能上有什么错误?

1 个答案:

答案 0 :(得分:5)

简短的回答:您的错误是在您的情况下使用head。您想与x进行比较,而不是head xs

通常,还要注意

  1. something ++ [x]在这里不像x : something那样实用(虽然实际上并不重要,但效率很高),因为顺序无关紧要,
  2. 作为f = \x -> something的函数实际上应该写为f x = something
  3. 您可能不应该使用相同的变量名来引用不同的值,这很容易造成混淆。

使用部分应用的==可以轻松地重写函数cond:

group [] = []
group (x:xs) = (x : takeWhile cond xs) : group (dropWhile cond xs)
  where cond = (==) x

这将产生group [1,1,1,2,4]的预期结果。