튜플의 표현을 사용하고 일반성에 대한 많은 눈이없이 다음은 문제 해결 방법입니다. 내가 입력의 패턴과 where
절에 정의에서 모두 발췌 변수 정의를 사용하는 방법
type Square2 a = ((a,a), (a,a))
type Square3 a = ((a,a,a), (a,a,a), (a,a,a))
extend1 :: Num a => Square2 a -> Square3 a
extend1 ((a,b), (c,d)) =
((a, b, ab )
, (c, d, cd )
, (ac, bd, abcd))
where
ab = a + b
cd = c + d
ac = a + c
bd = b + d
abcd = ab + cd
참고. 또한 완전히 새로운 출력을 구축하면서 입력을 파괴하고 소비하는 방법에 주목하십시오. 요소 중 일부는 재사용되지만 구조 자체는 파괴됩니다. 마지막으로 튜플의 내부에서 상수를 선택하고 Num
typeclass로 제약을 받으면 추가로 (+)
을 사용할 수 있습니다.
유사한 기능, 일반화 및 Array
의를 사용하여 우리가 Array
의의 정확한 크기를 알 수있는 능력을 잃었다
extend1A :: Num a => Array (Int,Int) a -> Array (Int, Int) a
같은 유형이 있지만, 우리의 기능 중 하나 Array
걸리는 것으로 나타났다 것 어떤 크기로 동일한 Num
-constrained 유형을 포함하는 다른 Array
을 동일하게 색인화하여 반환합니다.
array
함수는 첫 번째 인수로 경계 집합을 취합니다. 우리는 그런 array
가 두 번째 인수로 "assocs"의 목록을 취 입력 배열
extend1A ary0 = array bounds1 ... where
((minX, minY), (maxX, maxY)) = bounds ary0
(maxX1, maxY1) = (succ maxX, succ maxY)
bounds1 = ((minX, minY, (maxX1, maxY1))
의 bounds
에 따라 사람들을 업데이트해야합니다. 어떤 Array ix a
도 "ix
인덱스에서 a
"이라는 값을 나열하는 assocs [(ix, a)]
목록과 동등한 것으로 취급 할 수 있습니다 (대략). 이렇게하려면 우리가 이전에 관리 한 ix
유형의 bounds
을 알아야합니다.
이전 정보의 정보를 사용하여 배열을 업데이트하려면 이전 배열의 assocs
을 수정하여 새로운 정보를 포함시킵니다. 구체적으로는,이 extend1A
는 extraInformation
비어 있다면
extend1A ary0 = array bounds1 (priorInformation ++ extraInformation) where
priorInformation = assocs ary0
extraInformation = ...
((minX, minY), (maxX, maxY)) = bounds ary0
(maxX1, maxY1) = (succ maxX, succ maxY)
bounds1 = ((minX, minY, (maxX1, maxY1))
([]
) 같은 비트 다음 extend1A ary
그 범위의 모든 외부 입력 ary
및 undefined
의 범위에있는 모든 모든 인덱스에 ary
동일한 것이 보이는 것을 의미한다. 합계 정보를 extraInformation
으로 작성해야합니다.우리는 세 가지의 배열을 연장 생각하면
extend1A ary0 = array bounds1 (priorInformation ++ extraInformation) where
priorInformation = assocs ary0
extraInformation = xExtension ++ yExtension ++ totalExtension
xExtension = ...
yExtension = ...
totalExtension = ...
((minX, minY), (maxX, maxY)) = bounds ary0
(maxX1, maxY1) = (succ maxX, succ maxY)
bounds1 = ((minX, minY, (maxX1, maxY1))
, ab
및 extend1
에 cd
의해 표시된 xExtension
, extend1
에 ac
및 bd
의해 표시된 yExtension
우리가 각을 계산할 수 extend1
에 abcd
의해 표시된 totalExtension
부분적으로.
totalExtension
이 가장 쉽습니다. 각 (i,a)
쌍의 "값 구성 요소"의 합계가 priorInformation
입니다. xExtension
또는 yExtension
의 "값 구성 요소"의 합계 일 수도 있지만 가능하면 분명히 정확하기 위해 첫 번째 선택 항목을 선택하여 오른쪽 하단 모서리에 설치합니다. 우리는 반복해서 표시됩니다 sumValues
같은 새로운 기능을 정의 할 where
절을 사용할 수 있습니다
extend1A ary0 = array bounds1 (priorInformation ++ extraInformation) where
priorInformation = assocs ary0
extraInformation = xExtension ++ yExtension ++ totalExtension
sumValues asscs = sum (map snd asscs)
xExtension = ...
yExtension = ...
totalExtension = [((maxX1, maxY1), sumValues priorInformation)]
((minX, minY), (maxX, maxY)) = bounds ary0
(maxX1, maxY1) = (succ maxX, succ maxY)
bounds1 = ((minX, minY), (maxX1, maxY1))
참고.
그러면 우리는 priorInformation
을 통해 목록 보급으로 확장을 계산할 수 있습니다. 우리는 오래된 assoc에 대해 특정 종류의 합을 수집해야합니다 --- 하나의 인덱스가 고정되어있는 모든 값을 합산합니다.
xExtension = [((maxX1, yix)
, sumValues (filter (\((_, j), _) -> j == yix) priorInformation)
)
| yix <- [minY .. maxY]
]
yExtension = [((xix, maxY1)
, sumValues (filter (\((i, _), _) -> i == xix) priorInformation)
)
| xix <- [minX .. maxX]
]
그리고 나서 끝났습니다. 그것은 효율적이지 않지만 모든 조각이 함께 작동합니다.
extend1A ary0 = array bounds1 (priorInformation ++ extraInformation) where
priorInformation = assocs ary0
extraInformation = xExtension ++ yExtension ++ totalExtension
xExtension = [((maxX1, yix)
, sumValues (filter (\((_, j), _) -> j == yix) priorInformation)
)
| yix <- [minY .. maxY]
]
yExtension = [((xix, maxY1)
, sumValues (filter (\((i, _), _) -> i == xix) priorInformation)
)
| xix <- [minX .. maxX]
]
totalExtension = [((maxX1, maxY1), sum xExtension)]
((minX, minY), (maxX, maxY)) = bounds ary0
(maxX1, maxY1) = (succ maxX, succ maxY)
bounds1 = ((minX, minY), (maxX1, maxY1))
(내 지식) 행렬 라이브러리를 확장하기 위해, 그래서 당신이 올바른 크기 중 하나를 구성해야하고 내용을 복사 것, 고정 된 크기의 배열을 사용하여 대부분의 원래 배열의 새 배열로 이동합니다. 배열에서 배열과 요소로 'n'을 다시 사용했기 때문에 컴파일되지는 않지만 본질적으로 여기서하는 일입니다. 따라서이 형식을 검사하거나 수학적으로 의미를 갖지 않습니다. – bheklilr
고맙습니다. n = array ((a, b), (c, d), (m, m)) 또는 뭔가 사용하는 것이 더 좋습니까? – haskellnoob
'm'이 무엇인지 정의해야합니다. 하스켈은 당신이 원하는 곳에 자동적으로 찾아 낼 수 없다. 형식 서명을 정렬해야 할 것입니다. 현재 전달중인 것은'Array (Int, Int, Int), Int (Int, Int) Int) Int 또는 Int입니다. – bheklilr