안녕하세요 저는 SML에 새로 왔으며 두 개의 int와 문자열이있는 튜플이있는 목록 (제 경우에는 목록 prussia)을 매개 변수로 가져 오는 함수를 작성하려고했습니다. 내 함수는 다음과 같이 목록을 만들어야합니다. 반복없이 목록에 나타나는 모든 연도 (목록의 각 튜플의 두 번째 요소). 두 가지 함수를 만들어야합니다 (append_if_new는 목록의 1 년을 목록에 추가하면 작동합니다). year는 목록의 모든 튜플에 대해 수행해야합니다. foldl을 사용하여 시도했지만 tycon을 얻습니다. 불일치.
Pd. 이를 위해 함수 맵, 필터 또는 접기를 사용해야하며 append_if_new 기능을 연도 함수로 이동할 수 있습니다. 나는 매개 변수로 전달하는 함수가 전달해야 할 함수 유형이 아닌 폴드 호출에 오류가 있다고 생각하지만 문제가 무엇인지 확실하지 않습니다. 감사
val prussia =
[(0,1875,"G"),(2,1876,"G"),(2,1877,"G"),(1,1878,"G"),(0,1879,"G"),
(0,1880,"G"),(1,1881,"G"),(1,1882,"G"),(0,1883,"G"),(3,1884,"G"),
(0,1885,"G"),(2,1886,"G"),...] : (int * int * string) list
fun append_if_new (lista:(int*int*string)list): int list =
let
val lista2 = []
val x = hd lista
val z = #2x
in
if (List.exists (fn y => y = z) lista2)
then lista2
else lista2@[z]
end
fun years (lista:(int*int*string)list): int list =
List.foldl append_if_new 0 lista
반복없이 목록에 나타나는 모든 연도를 포함하는 목록을 만듭니다.
(목록의 각 튜플의 두 번째 요소)
다음을 사용하여 반복 목록을 만들고 map
나중에 중복 항목을 필터링 할 수 있습니다 .
fun year_of (_, year, _) = year
fun member (y, xs) = List.exists (fn x => y = x) xs
fun nub [] = []
| nub (x::xs) = if member (x, xs)
then nub xs
else x :: nub xs
fun years records = nub (map year_of records)
여기 nub
에는 O (n²) 의 점근 적 실행 시간 복잡도가 있으며 이는 나쁘고 불필요합니다. 다음과 같이 중복 항목을 삽입하지 않도록 목록을 접을 수도 있습니다.
fun member (y, xs) = List.exists (fn x => y = x) xs
fun years records =
let
fun insert ((_, year, _), years) =
if member (year, years)
then years
else year :: years
in
foldr insert [] records
end
그러나 점근 적 실행 시간은 동일하며 읽기가 약간 더 모호합니다. 효율적인 방식으로 중복 항목을 필터링하려면 트리 기반 집합 또는 유사 항목과 같이보다 효율적인 데이터 구조를 사용하여 중복 항목을 관리해야합니다. 하스켈, 이것은 간의 차이 nub
와 nubOrd
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다