<div>Hi,<br></div><div></div><div>I&#39;m trying to get my head around datatypes, and wondering how I might define a simple  &quot;Task&quot; datatype in Haskell.</div><div></div><div>data Task = Task { title :: String, completed :: Bool }</div>
<div></div><div>Ok, that&#39;s straightforward, but sometimes tasks become a list of tasks themselves</div><div></div><div>data Task = Task { title :: String, completed :: Bool, subtasks :: [Task] }</div><div></div><div>But that&#39;s not really right, because obviously, some tasks don&#39;t have subtasks. So I try this:</div>
<div></div><div>data Task = Task { title :: String, completed :: Bool } | TaskWithSubtasks { title :: String, completed :: Bool, subtasks :: [Task] }</div><div></div><div>It&#39;s a bit more accurate, but it&#39;s repeating things, which is ok with a simple type. Could anyone suggest a better way to define this? If I was using C#, which I&#39;m far more familiar with, I could overload the constructor and refer to the smaller constructor. Is there a way to do that in Haskell, or am I still thinking too OOP?</div>
<div></div><div>Iain</div>