LINUX.ORG.RU

История изменений

Исправление qnikst, (текущая версия) :

вот кстати полный кейс (где нужно состояние visited таскать уже с unfoldr лучше смотреться будут), хотя я обычно через вспомогательную функцию такое делал (но это только в задачках, не помню, чтобы в работе нужно было):

extendCluster :: (Point -> [Point]) -> [Point] -> [Point]
extendCluster range =  unfoldr go . (Set.empty,)
   go (_, []) = Nothing
   go (visited, (f:fs))
      | f `V.member` visited = go visited fs
      | otherwise = Just (f, (Set.insert f visited, fs ++ range f))

P.S. а кто-нить кому нечего делать не хочет написать решение через комонады или Fix?

Исправление qnikst, :

вот кстати полный кейс (где нужно состояние visited таскать уже с unfoldr лучше смотреться будут), хотя я обычно через вспомогательную функцию такое делал (но это только в задачках, не помню, чтобы в работе нужно было):

extendCluster :: (Point -> [Point]) -> [Point] -> [Point]
extendCluster range =  unfoldr go . (Set.empty,)
   go (_, []) = Nothing
   go (visited, (f:fs))
      | f `V.member` visited = go visited fs
      | otherwise = Just (f, (Set.insert f visited, fs ++ range f))

Исправление qnikst, :

вот кстати полный кейс (где нужно состояние visited таскать уже с unfoldr лучше смотреться будут), хотя я обычно через вспомогательную функцию такое делал (но это только в задачках, не помню, чтобы в работе нужно было):

extendCluster :: (Point -> [Point]) -> [Point] -> [Point]
extendCluster range =  unfoldr go . (Set.empty,)
   go (_, []) = Nothing
   go (visited, (f:fs))
      | f `V.member` visited = go visited fs
      | otherwise = Just (f, Set.insert f visited, fs ++ range f)

Исправление qnikst, :

вот кстати полный кейс (где нужно состояние visited таскать уже с unfoldr лучше смотреться будут), хотя я обычно через вспомогательную функцию такое делал (но это только в задачках, не помню, чтобы в работе нужно было):

extendCluster :: (Point -> [Point]) -> [Point] -> [Point]
extendCluster range =  unfoldr go 
   go (_, []) = Nothing
   go (visited, (f:fs))
      | f `V.member` visited = go visited fs
      | otherwise = Just (f, Set.insert f visited, fs ++ range f)

Исходная версия qnikst, :

вот кстати полный кейс (где нужно состояние visited таскать уже с unfoldr лучше смотреться будут), хотя я обычно через вспомогательную функцию такое делал (но это только в задачках, не помню, чтобы в работе нужно было):

extendCluster :: (Point -> [Point]) -> [Point] -> [Point]
extendCluster range =  unfordr go 
   go (_, []) = Nothing
   go (visited, (f:fs))
      | f `V.member` visited = go visited fs
      | otherwise = Just (f, Set.insert f visited, fs ++ range f)