我有一個 if-else 陳述句,在 else 塊中,我希望它首先遞回到函式,除了串列的最后兩個元素,然后回傳兩個元素。
在下面的函式中,在 if-else 陳述句之后,我有 2 行代碼。但是這不會編譯。我相信編譯器將這兩行作為一行代碼讀取。你如何解決這個問題?
doubleEveryOther :: [Integer] -> [Integer] --outputs the input list, but every 2nd element(from the right) is doubled
doubleEveryOther [] = []
doubleEveryOther x = if (length x <2)
then
x
else
doubleEveryOther init (init x) -- These two lines
[2*last(init x), last x] -- These two lines
編譯器說:
* Couldn't match expected type: [Integer]
with actual type: [a0] -> [a0]
* Probable cause: `init' is applied to too few arguments
In the first argument of `doubleEveryOther', namely `init'
In the expression: doubleEveryOther init (init x)
In the expression:
[doubleEveryOther init (init x), 2 * last (init x), last x]
|
19 | [doubleEveryOther init (init x), 2*last(init x), last x]
|
uj5u.com熱心網友回復:
您不能回傳兩個串列。如果您有兩個要合并的結果,您可以使用一些函式,例如( ) :: [a] -> [a] -> [a]
.
話雖如此,你在這里不需要這個。您可以使用簡單的模式匹配:
doubleEveryOtherFromLeft :: Num a => [a] -> [a]
doubleEveryOtherFromLeft (x:y:xs) = 2*x : y : doubleEveryOtherFromLeft xs
doubleEveryOtherFromLeft xs = xs
那么我們doubleEveryOther
可以將串列反轉兩次:
doubleEveryOther:: Num a => [a] -> [a]
doubleEveryOther = reverse . doubleEveryOtherFromLeft . reverse
uj5u.com熱心網友回復:
我認為您只是缺少附加運算子
:
doubleEveryOther (init (init x))
[2 * last (init x), last x]
uj5u.com熱心網友回復:
我有一個 if-else 陳述句,在 else 塊中我希望它首先遞回到函式,除了串列的最后兩個元素,然后回傳兩個元素
好的。我有點明白你在做什么。函式名很好——最好的名字是verb-noun
,here doubleEveryOther
。但是,該代碼看起來很像 Lisp,可能是 Scheme——重復使用init
將其暴露出來。這不是你寫 Haskell 的方式。(我也用 Haskell 語法寫了太多的 Lisp……)
Haskell 遞回使用模式匹配作業。
lst = [2,3,4]
1 : [2,3,4] -- [1,2,3,4]
lst = [1,2,3,4]
(x:xs) = lst -- x is 1, xs = [2,3,4]
因此,在這種情況下,您希望將您的串列與x:y:xs
:
lst = [1,2,3,4]
(x:y:xs) = lst -- x is 1, y is 2, xs=[3,4]
因此:
doubleEveryOther :: Num a => [a] -> [a]
doubleEveryOther [] = []
doubleEveryOther [x] = [2*x]
doubleEveryOther (x:y:xs) = (2*x):doubleEveryOther xs
請注意需要處理的特殊情況的數量。如果給我一個空串列,我應該回傳一個空串列。如果給我一個值,我需要將它加倍(類似于你的 if .. else 子句)。如果給我兩個或多個值,則匹配 x=first、y=second、xs=[] 或更多。
至于回傳多個值,你可以從一個函式中只回傳一件事。它可以是單個值、單個元組、單個串列等。
在這種情況下,您撰寫了一個函式,它說doubleEveryOther
- 好 - 但是您希望回傳最后兩個值不變。你最好去掉最后兩個值,運行簡單doubleEveryOther
,然后在最后用螺栓固定最后兩個值。否則,您的功能負擔過重。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/522117.html
標籤:if 语句哈斯克尔编译器错误
上一篇:SQL查詢如果折扣金額中有空值,如何使用組合表制作凈金額
下一篇:放置多個條件后未填充列