コードに問題があります。次のとおりです。
import Data.List
splitat _ [] = ([],[])
splitat element (head:tail)
| element == head = ([],(head:tail))
| otherwise = ([head]++fst(splitat element tail), snd(splitat element tail))
'element'でリストを分割し、次に左右のサブリストをタプルに結合します。ただし、3行目では、「splitat elementtail」コマンドが2回呼び出されます。1回は「fst」を介して、もう1回は「snd」を介して呼び出されます。再帰ツリーを狭く保つために、この項を1回だけ評価する方法はありますか?
前もって感謝します。
はい。let
式またはwhere
句を利用できます。例えば:
splitat :: Eq a => a -> [a] -> ([a], [a])
splitat _ [] = ([],[])
splitat x' xa@(x:xs) | x == x' = ([], xa)
| otherwise = (x:ys1, ys2)
where (ys1, ys2) = splitat x' xs
注:くださいません使用し
head :: [a] -> a
たりtail :: [a] -> [a]
、またはこれらがあろうから、変数として定義されている他の機能シャドウ既存のバインディング。人はそれを考えるかもしれないので、それは、コードに関する理由に難しく、それを作るhead
とtail
、これらの機能ではなく、変数を参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加