Put the beans in a large bowl and cover with about 3 times their volume of cold water. Soak overnight in a cool place.
Drain the beans and transfer to a large pot or Dutch oven. Add 10 cups water and the ham. Bring to a simmer over medium heat, then reduce the heat to low and cook until the beans are tender, about 1 hour, 30 minutes. Transfer the ham to a plate to cool slightly, then remove the bone, if used, and dice the meat. Return the meat to the pot.
Meanwhile, cover the potato with water in a saucepan and season with salt. Bring to a boil over medium-high heat, then reduce the heat and simmer until the potato is fork-tender, 20 to 25 minutes. Drain the potato; transfer to a bowl with the milk and mash with a potato masher or fork until smooth. Add the mashed potato to the bean soup and stir until combined.
Melt the butter in a large skillet over medium heat. Add the onion, celery, garlic and parsley and cook until the vegetables are translucent, 7 to 10 minutes. Add the vegetable mixture to the soup, reduce the heat to low and cook 1 hour, adding up to 2 more cups water if the soup is too thick. Season with salt and pepper.